React之条件渲染(学习和总结)

2023-11-12

在实际开发中经常会遇到条件渲染,一般都是通过if else 语句、三元运算符、switch case 语句来实现,这里记录并学习一下

1:条件渲染之 IF

const users = [
  { id: '1', firstName: 'Robin', lastName: 'Wieruch' },
  { id: '2', firstName: 'Dennis', lastName: 'Wieruch' },
];
 
function App() {
  return (
    <div>
      <h1>Hello Conditional Rendering</h1>
      <List list={users} />
    </div>
  );
}
 
function List({ list }) {
  // 保护模式
  if (!list) {
    return null;
  }
 
  return (
    <ul>
      {list.map(item => (
        <Item key={item.id} item={item} />
      ))}
    </ul>
  );
}
 
function Item({ item }) {
  return (
    <li>
      {item.firstName} {item.lastName}
    </li>
  );
}

2:条件渲染之IF ELSE 

function List({ list }) {
  if (!list) {
    return null;
  }
 
  if (!list.length) {
    return <p>Sorry, the list is empty.</p>;
  } else {
    return (
      <div>
        {list.map(item => (
          <Item item={item} />
        ))}
      </div>
    );
  }
}
function List({ list }) {
  if (!list) {
    return null;
  }
 
  if (!list.length) {
    return <p>Sorry, the list is empty.</p>;
  }
 
  return (
    <div>
      {list.map(item => (
        <Item item={item} />
      ))}
    </div>
  );
}

3:条件渲染之三元表达式

function Recipe({ food, isEdit }) {
  return (
    <div>
      {food.name}
 
      {isEdit ? (
        <EditRecipe food={food} />
      ) : (
        <ShowRecipe food={food} />
      )}
    </div>
  );
}

4:条件渲染之 && 

function LoadingIndicator({ isLoading }) {
  return <div>{isLoading && <p>Loading...</p>}</div>;
}

5:条件渲染之 SWITCH CASE

function Notification({ text, status }) {
  switch (status) {
    case 'info':
      return <Info text={text} />;
    case 'warning':
      return <Warning text={text} />;
    case 'error':
      return <Error text={text} />;
    default:
      return null;
  }
}
function Notification({ text, status }) {
  return (
    <div>
      {(function() {
        switch (status) {
          case 'info':
            return <Info text={text} />;
          case 'warning':
            return <Warning text={text} />;
          case 'error':
            return <Error text={text} />;
          default:
            return null;
        }
      })()}
    </div>
  );
}
function Notification({ text, status }) {
  return (
    <div>
      {(() => {
        switch (status) {
          case 'info':
            return <Info text={text} />;
          case 'warning':
            return <Warning text={text} />;
          case 'error':
            return <Error text={text} />;
          default:
            return null;
        }
      })()}
    </div>
  );
}

6:多个条件渲染

(1)利用枚举

const NOTIFICATION_STATES = {
  info: 'Did you know? ...',
  warning: 'Be careful here ...',
  error: 'Something went wrong ...',
};

function Notification({ text, status }) {
  return (
    <div>
      {
        {
          info: <Info text={text} />,
          warning: <Warning text={text} />,
          error: <Error text={text} />,
        }[status]
      }
    </div>
  );
}

(2) 不依赖[状态]的时候


const NOTIFICATION_STATES = {
  info: <Info />,
  warning: <Warning />,
  error: <Error />,
};
 
function Notification({ status }) {
  return (
    <div>
      {NOTIFICATION_STATES[status]}
    </div>
  );
}

(3)利用函数


const getNotification = text => ({
  info: <Info text={text} />,
  warning: <Warning text={text} />,
  error: <Error text={text} />,
});
 
function Notification({ status, text }) {
  return <div>{getNotification(text)[status]}</div>;
}

7:高阶组件

function withLoadingIndicator(Component) {
  return function EnhancedComponent({ isLoading, ...props }) {
    if (!isLoading) {
      return <Component {...props} />;
    }
 
    return (
      <div>
        <p>Loading</p>
      </div>
    );
  };
}
 
const ListWithLoadingIndicator = withLoadingIndicator(List);
 
function App({ list, isLoading }) {
  return (
    <div>
      <h1>Hello Conditional Rendering</h1>
 
      <ListWithLoadingIndicator isLoading={isLoading} list={list} />
    </div>
  );
}

8:借助其他库

<Choose>
  <When condition={isLoading}>
    <div><p>Loading...</p></div>
  </When>
  <Otherwise>
    <div>{list.map(item => <Item item={item} />)}</div>
  </Otherwise>
</Choose>

9:利用es6 Map对象  原理和第六点是一样的(高级一丢丢)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React之条件渲染(学习和总结) 的相关文章

  • “React”在定义之前就被使用了

    我正在使用 create react app typescript eslint 应用程序 在构建过程中出现这样的错误 Line 1 8 React was used before it was defined typescript esl
  • ‘state’未定义 no-undef

    我使用教程来学习 React 但我很快就陷入困境 在教程中 他们使用以下代码 import React Component from react class Counter extends Component state count 0 r
  • 更改react-chartjs 2中的工具提示方向

    我已经实现了react chartjs2https www npmjs com package react chartjs 2 https www npmjs com package react chartjs 2在我的反应应用程序中 我已
  • React:搜索过滤器无法正常工作

    我通过 API 从服务器获取记录 API 是在 Loopback 中构建的 实际上 我在每个页面上显示 5 条记录 目前工作正常 我可以导航next or prev通过分页按钮 每页显示 5 条记录 问题是 当用户在搜索框中键入内容时 记录
  • 在非输入元素上反应 onKeyDown/onKeyUp 事件

    我需要捕获 cmd 按钮向上和向下事件 以便选择是否在 setState 中使用串联 例如 我如何在表元素上获取这些事件 您必须在主体 窗口级别捕获按键 表元素没有输入焦点 因此您无法从表中捕获键 没有输入元素 var cmdDown fa
  • 是否应该使用箭头函数创建类方法

    在创建 React 组件时 我有时会在网络上使用箭头函数语法创建方法 有时则不使用箭头函数语法 例如 class Component extends someFnk param gt vs class Component extends s
  • 即使不改变对象和数组,也无法更改减速器中的嵌套对象

    我正在尝试更新减速器内的状态 我知道我不应该改变对象或嵌套对象 所以我使用map用于数组或对象的对象扩展 但似乎我无法真正更改深层嵌套的值 除了我无法更改状态这一事实之外 我真的不喜欢代码的外观 尤其是仅更改一个属性所需执行的循环数量 我觉
  • React - 如何在合成事件回收之前触发preventDefault()?

    我在 React 组件中有以下函数 该函数在单击链接时运行 onClick e name e stopPropagation const doIt await checkSomething if doIt e preventDefault
  • 从父组件触发子组件内部的函数

    如何从父组件触发子组件内部的函数 以与抽屉导航相同的风格进行操作 他们这样做 this props navigation toggleDrawer 来自父母 我怎样才能做同样的事情 如果我正确理解你的问题 我认为你有点混淆了 您显示的示例是
  • 检查所有子组件是否已安装

    有什么办法可以检测孩子是否已经挂载了吗 当我初始化同位素时 必须安装所有子组件才能初始化 超时时间为 5 毫秒 它按预期工作 但我确信有更好的方法 componentDidMount function var container this
  • 如何为谷歌材料条形图制作动画

    我正在反应项目中绘制反应谷歌条形图 材料图表 并且我正在尝试制作动画 我读过这种图表不支持动画 但我需要这样做 必须有任何方法可以做到这一点 我很难认为新的东西比旧的东西更糟糕 有人知道我该怎么做吗 我尝试了很多不同的方法 但没有任何效果
  • 如何在 React Native 中做最后一个子选择器?

    我使用Scrollview 里面有3个视图 我在它们之间留了一个间隙 例如 marginRight 5 但我不希望在最后一个视图中出现这种间隙 这就是为什么我需要这种东西 你能帮助我吗 应用这个你就可以实现你在寻找什么 const styl
  • 从 Redux 状态删除一个项目

    我想知道如果可能的话你是否能帮我解决这个问题 我正在尝试从 Redux 状态中删除一个项目 我已经传入了用户点击的项目的IDaction data进入减速机 我想知道如何匹配action data使用 Redux 状态中的 ID 之一 然后
  • 如何在 React 中使用 tailwindcss 的平滑滚动?

    我使用创建了一个单页网站tailwindcss and React 在原型中我使用tailwindcss类 scroll smooth 并且它有效 在React scroll smooth 类不起作用 但原因是什么 https tailwi
  • 文件操作耗时较长,收到“正在运行[文件、保存、删除创建参与者”消息

    使用 JavaScript React 和 Node 时 会发生在 VSCode 版本 1 52 1 中 我已经在 VSCode 中从事 React 项目几个月了 在那两个月的某个时刻 我开始注意到 VSCode 处理文件操作的速度显着下降
  • React Native:访问静态函数内的组件状态

    我有一个这样定义的组件 export class A extends Component constructor props this state scene 0 static changeScene scene this setState
  • 如何使用 gatsby-image 不裁剪地显示图像?

    实例 图像可能加载缓慢 https suhadolnik photo surge sh portreti https suhadolnik photo surge sh portreti 我正在使用 GatsbyJS 制作一个摄影网站 并使
  • 使用 useCallback 并使用先前状态作为参数设置新对象状态

    考虑这个带有自定义表单钩子的基本表单字段组件来处理输入更改 import React useState useCallback from react const useFormInputs initialState gt const val
  • 如何强制重新安装 React 组件?

    假设我有一个具有条件渲染的视图组件 render if this state employed return div div
  • Material UI Drawer设置背景色

    如何简单设置Material UI的背景色Drawer 尝试过这个 但不起作用

随机推荐

  • 13.网络爬虫—多进程详讲(实战演示)

    网络爬虫 多进程详讲 一 进程的概念 二 创建多进程 三 进程池 四 线程池 五 多进程和多线程的区别 六 实战演示 北京新发地线程池实战 前言 个人简介 以山河作礼 Python领域新星创作者 CSDN实力新星认证 第一篇文章 1 认识网
  • iso文件添加服务器,服务器挂载本地iso文件

    RHEL6 3配置文件共享 2 autofs服务 在上篇博文中我们介绍了利用NFS服务设置文件共享 在客户端必须要先将服务器端的NFS共享目录挂载到本地 然后才能使用 其实在Linux系统中还为我们提供了另外一种更为简单的使用NFS共享的方
  • Java对象深拷贝的几种方式

    对象拷贝 项目开发过程中很多时候需要进行对象复制 可是有的时候会发生复制后的对象 在原对象改变后也相应发生改变 这种时候就有问题了 所以很有必要了解对象的深拷贝 以及深拷贝的几种方式 new 对象 手动 new 新的对象 一个属性一个属性的
  • 掌财社:Flask怎么实现注册登录项目?

    注册和登录功能是绝大多数web应用都需要实现的功能 是相当基础的功能模块 注册登录功能实现需要注意的地方也有很多 今天小编带来了一篇flask实现注册登录功能的项目的简单实现的文章 希望能给正在学习flask的小伙伴一点帮助 本文主要介绍了
  • 调试共享几何图形池

    没有这一节的资料 但是代码该调试到这里了 随意调试着玩吧 环境变量本机都没有设置 看这个意思 似乎是只需要一个几何体 所有的瓦片用类似于matrixTransform gt addChild node 的方式 看看创建 上一层 为什么是第0
  • 买卖股票的最佳时机含手续费--贪心算法

    LeetCode 买卖股票的最佳时机含手续费 给定一个整数数组 prices 其中第 i 个元素代表了第 i 天的股票价格 非负整数 fee 代表了交易股票的手续费用 你可以无限次地完成交易 但是你每笔交易都需要付手续费 如果你已经购买了一
  • 利用Google翻译实现网站国际化——js插件

    文章描述了很多作者的思路 显得繁琐和冗余 若无兴趣请直接下载资源 查阅最终解决方案 最终解决方案 代码静态化已经全部完成 包括面板语言文件 已添加完备的注释 请直接查阅 下载插件js谷歌翻译插件 示例请使用 本地静态资源 html 需要修改
  • Spring AutowireCapableBeanFactory

    Spring AutowireCapableBeanFactory接口的使用小结 Spring的ioc容器中有一个接口叫AutowireCapableBeanFactory 我们从名字中可以看出 具有自动装配Bean的能力 而且这里笔者先透
  • 刷脸支付是万亿级支付模式新趋势

    随着5G时代的到来 互联网 AI智能 云计算 物联网等技术的成熟 一种连手机都不需要的新型支付方式诞生了 那就是刷脸支付 扫码支付较现金支付无需找零 无需携带钱包 只需要扫码就可以完成支付 对于商家和顾客来说 支付变得简单多了 如果说 扫码
  • Feign接口Get请求自动转化成POST

    原因 在入参的时候如果没有通过注解指定 此时的参数会自动封装到body中 feign检测到body里面有请求参数就会默认使用post请求 解决方法 解决方法也很简单 只需要在参数前加 SpringQueryMap即可 GetMapping
  • vue模块化

    vue模块化 模块化开发 不使用模块化带来的问题 CommonJS es6的模块化的导出和导入 export的基本使用 export default导出 统一全部导出 模块化开发 不使用模块化带来的问题 初始模块化思想 CommonJS e
  • 拖延症解药

    拖延症解药 完美主义 情绪问题 原谅过去的自己 与自己和解 不做准备工作 在不充分条件下启动 计划 死线 是第一生产力 将 死线 提前 将它分段 分解为几个阶段性 死线 一个一个完成 更易启动 降低不确定性 完成一个小目标后奖励自己 顺序
  • 电影下载资源总结

    电驴电骡 donkey4u com emul软件 BT kickass to kat ph isohunt com www torrentkitty com thepiratebay sx thepiratebay ee 论坛 cmct c
  • python绘制三维图

    一 初始化 假设已经安装了matplotlib工具包 利用matplotlib figure Figure创建一个图框 1 2 3 4 import matplotlib pyplot as plt from mpl toolkits mp
  • Elasticsearch 5.6.5 基础笔记(一) - 概念和安装

    概念 Elasticsearch 分布式 可扩展 实时的搜索与数据分析引擎 建立在全文搜索引擎库 Apache Lucene 基础之上 能胜任上百个服务节点的扩展 并支持 PB 级别的结构化或者非结构化数据 将所有的功能打包成一个单独的服务
  • 动态数组的创建与维护

    说是动态数组 其实就是在满容量时 再创建创建一个一定容量的数组 实例代码中是原数组容量的一倍 并将对数组的引用指向新的数组 而当数组容量比较小时 则创建一个一定容量的数组 示例代码中是原数组容量的1 4 并将对数组的引用指向新的数组 示例代
  • Vulkan-程序结构

    程序结构 一般来说 完整的Vulkan程序包含 创建Vulkan实例 获取物理设备列表创建逻辑设备 创建命令缓冲 获取设备中支持图形工作的队列 初始化交换链 创建深度缓冲 创建渲染通道 创建帧缓冲 创建绘制对象 初始化渲染管线 创建栅栏和初
  • Qt获取wifi列表,连接wifi后获取IP地址

    环境win7 qt5 13 MinGW32 台式机 直接上步骤了 网上看到的略显啰嗦 就是这么简单直接 1 头文件 include windows h include wlanapi h 2 pro设置连接路径 需要根据自己安装路径加载 L
  • 要成为一名成功的网络爬虫开发者,需要了解哪些知识点?

    要成为一名成功的网络爬虫开发者 您需要掌握以下一些关键知识 编程语言 Python 是最常用的编程语言之一 特别适合网络爬虫开发 您需要掌握 Python 的基础语法 数据结构和面向对象编程 HTTP 和网络基础知识 了解 HTTP 请求和
  • React之条件渲染(学习和总结)

    在实际开发中经常会遇到条件渲染 一般都是通过if else 语句 三元运算符 switch case 语句来实现 这里记录并学习一下 1 条件渲染之 IF const users id 1 firstName Robin lastName