- ReactJS 教程
- ReactJS - 首页
- ReactJS - 简介
- ReactJS - 路线图
- ReactJS - 安装
- ReactJS - 功能特性
- ReactJS - 优点与缺点
- ReactJS - 架构
- ReactJS - 创建 React 应用
- ReactJS - JSX
- ReactJS - 组件
- ReactJS - 嵌套组件
- ReactJS - 使用新创建的组件
- ReactJS - 组件集合
- ReactJS - 样式
- ReactJS - 属性 (props)
- ReactJS - 使用属性创建组件
- ReactJS - props 验证
- ReactJS - 构造函数
- ReactJS - 组件生命周期
- ReactJS - 事件管理
- ReactJS - 创建一个事件感知组件
- ReactJS - 在 Expense Manager 应用中引入事件
- ReactJS - 状态管理
- ReactJS - 状态管理 API
- ReactJS - 无状态组件
- ReactJS - 使用 React Hooks 进行状态管理
- ReactJS - 使用 React Hooks 进行组件生命周期管理
- ReactJS - 布局组件
- ReactJS - 分页
- ReactJS - Material UI
- ReactJS - Http 客户端编程
- ReactJS - 表单编程
- ReactJS - 受控组件
- ReactJS - 非受控组件
- ReactJS - Formik
- ReactJS - 条件渲染
- ReactJS - 列表
- ReactJS - 键 (Keys)
- ReactJS - 路由
- ReactJS - Redux
- ReactJS - 动画
- ReactJS - Bootstrap
- ReactJS - Map
- ReactJS - 表格
- ReactJS - 使用 Flux 管理状态
- ReactJS - 测试
- ReactJS - CLI 命令
- ReactJS - 构建和部署
- ReactJS - 示例
- Hooks
- ReactJS - Hooks 简介
- ReactJS - 使用 useState
- ReactJS - 使用 useEffect
- ReactJS - 使用 useContext
- ReactJS - 使用 useRef
- ReactJS - 使用 useReducer
- ReactJS - 使用 useCallback
- ReactJS - 使用 useMemo
- ReactJS - 自定义 Hooks
- ReactJS 高级
- ReactJS - 可访问性
- ReactJS - 代码分割
- ReactJS - Context
- ReactJS - 错误边界
- ReactJS - 转发 Refs
- ReactJS - 片段 (Fragments)
- ReactJS - 高阶组件
- ReactJS - 与其他库集成
- ReactJS - 性能优化
- ReactJS - Profiler API
- ReactJS - Portals
- ReactJS - 无 ES6 ECMAScript 的 React
- ReactJS - 无 JSX 的 React
- ReactJS - 调和 (Reconciliation)
- ReactJS - Refs 和 DOM
- ReactJS - Render Props
- ReactJS - 静态类型检查
- ReactJS - Strict Mode
- ReactJS - Web Components
- 其他概念
- ReactJS - 日期选择器
- ReactJS - Helmet
- ReactJS - 内联样式
- ReactJS - PropTypes
- ReactJS - BrowserRouter
- ReactJS - DOM
- ReactJS - 走马灯 (Carousel)
- ReactJS - 图标
- ReactJS - 表单组件
- ReactJS - 参考 API
- ReactJS 有用资源
- ReactJS - 快速指南
- ReactJS - 有用资源
- ReactJS - 讨论
ReactJS - 片段 (Fragments)
Fragment 是一个简单的解决方案,用于分组多个 React 元素,而无需在 DOM 中添加额外的标记。
在 React 中,组件的 render 方法允许返回一个 React 元素。对于组件要返回多个元素,这些元素需要包装在一个通用的容器元素中。例如,要返回多个 p 元素,应该将其包装在一个 div 元素中,如下所示:
<div> <p>One</p> <p>Two </p> </div>
对于大多数场景,包装一个通用的根元素是可以的,但某些场景需要特殊处理。它们如下:
某些元素,例如 li、td 等,不能被包装在通用元素中。
当组件只需要返回部分元素列表时(最终将被包装在父组件中)。
让我们编写一个简单的组件来更好地理解我们的问题。该组件的功能是返回部分客户列表,如下所示:
<li>John</li> <li>Peter</li>
使用 create-react-app 创建一个新应用程序并启动它。
create-react-app myapp cd myapp npm start
在 components 文件夹下创建一个组件 ListOfCustomer (src/components/ListOfCustomer.js)
import React from 'react' class ListOfCustomer extends React.Component { constructor(props) { super(props); } render() { console.log(this.props) var names = this.props['names']; var namesList = names.map( (name, index) => <li>{name}</li> ) return <ul>{namesList}</ul> } } export default ListOfCustomer
在这里,组件遍历 names 属性并将它渲染成一个 li 元素列表。
现在,在我们的根组件 (App.js) 中使用该组件。
import ListOfCustomer from './components/ListOfCustomer'; function App() { var names = ["John", "Peter"] return ( <ul> <ListOfCustomer names={names} /> </ul> ); } export default App;
这将导致渲染多个 ul,如下所示:
<ul><ul><li>John</li><li>Peter</li></ul></ul>
让我们更改组件以使用 React.Fragment。
import React, { Fragment } from 'react' class ListOfCustomer extends React.Component { constructor(props) { super(props); } render() { console.log(this.props) var names = this.props['names']; var namesList = names.map( (name, index) => <li>{name}</li> ) return <React.Fragment>{namesList}</React.Fragment> } } export default ListOfCustomer
现在,我们的组件渲染有效的 HTML 文档。
<ul><li>John</li><li>Peter</li></ul>
带键的片段 (Keyed Fragments)
在上面的示例中,React 在开发者控制台中抛出一个警告,如下所示:
Warning: Each child in a list should have a unique "key" prop. Check the render method of `ListOfCustomer`. See https://reactjs.ac.cn/link/warning-keys for more information. li ListOfCustomer@https://127.0.0.1:3000/main.4bbe8fa95c723e648ff5.hot-update.js:26:10 ul App render - ListOfCustomer.js:9
正如警告所说,React 期望列表中的每个元素都有唯一的键。它使用键来识别哪些元素已更改、已添加或已删除。React.Fragment 允许通过其 key 属性传递键。React 将在内部使用它来只渲染列表中已修改的项。让我们更改我们的代码并向 React.Fragment 添加键,如下所示:
import React, { Fragment } from 'react' class ListOfCustomer extends React.Component { constructor(props) { super(props); } render() { console.log(this.props) var names = this.props['names']; var namesList = names.map( (name, index) => <li key={index}>{name}</li> ) return <React.Fragment>{namesList}</React.Fragment> } } export default ListOfCustomer
这将消除错误。
简写语法
React.Fragment 有一种替代的简写语法,它既易于使用又易于阅读。
<> JSX element </>
让我们更改我们的代码以适应简写语法。更新后的代码如下所示:
import React, { Fragment } from 'react' class ListOfCustomer extends React.Component { constructor(props) { super(props); } render() { console.log(this.props) var names = this.props['names']; var namesList = names.map( (name, index) => <li key={index}>{name}</li> ) return <>{namesList}</> } } export default ListOfCustomer