- 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 - 片段
- ReactJS - 高阶组件
- ReactJS - 与其他库集成
- ReactJS - 性能优化
- ReactJS - Profiler API
- ReactJS - Portals
- ReactJS - 无 ES6 ECMAScript 的 React
- ReactJS - 无 JSX 的 React
- ReactJS - 调和
- ReactJS - Refs 和 DOM
- ReactJS - 渲染属性
- ReactJS - 静态类型检查
- ReactJS - Strict Mode
- ReactJS - Web Components
- 其他概念
- ReactJS - 日期选择器
- ReactJS - Helmet
- ReactJS - 内联样式
- ReactJS - PropTypes
- ReactJS - BrowserRouter
- ReactJS - DOM
- ReactJS - 轮播图
- ReactJS - 图标
- ReactJS - 表单组件
- ReactJS - 参考 API
- ReactJS 有用资源
- ReactJS - 快速指南
- ReactJS - 有用资源
- ReactJS - 讨论
ReactJS - 渲染属性
由于 React 组件通过组合(一个组件嵌套在另一个组件内部)而不是继承来连接,因此一个 React 组件中使用的逻辑不会直接共享到另一个组件。React 提供了多种在组件之间共享逻辑的选项,其中一个选项就是渲染属性。渲染属性基本上是通过其 props 将包含必要渲染逻辑的函数传递给具有核心功能的组件。因此,它被称为渲染属性。
让我们学习如何在本章中使用渲染属性。
如何使用渲染属性
让我们看看如何逐步使用渲染属性并在两个组件之间共享逻辑。让我们考虑从外部 URL 获取和渲染数据的场景。
创建一个组件,FetcherComponent 用于从外部 url 获取数据,FetcherConsumerComponent 用于使用数据并渲染它。
为给定的 url (props.url) 创建一个带有数据获取逻辑的组件 FetcherComponent。
componentDidMount() { fetch(this.props.url) .then((response) => response.json()) .then((data) => { this.setState({ data: data }); }); }
现在,更新FetcherComponent,以便核心渲染逻辑将委托给 props (this.props.render)。
render() { return ( <div> <h2>Fetch react component</h2> {this.state.data && this.props.render(this.state.data)} </div> ) }
这里:
this.props.render 是具有渲染逻辑的函数,将通过其他任何组件的 props 传递到 FetcherComponent。
创建一个组件 FetcherConsumerComponent 并通过传递获取数据的渲染逻辑来渲染 FetcherComponent。
render() { return (<FetcherComponent url="users.json" render={(items) => ( <ul> {items && items.length && items.map((item) => <li key={item.id}>{item.name}</li> )} </ul> )} />) }
这里:
items 是由FetcherComponent 组件获取的数据。
它们被循环遍历并发出 HTML 无序列表。
我们可以按照章节中定义的步骤,在下一节中创建一个可工作的示例。
应用渲染属性
首先,创建一个新的 React 应用,并使用以下命令启动它。
create-react-app myapp cd myapp npm start
接下来,打开App.css (src/App.css) 并删除所有 CSS 类。然后,创建一个组件 FetchRenderProps (src/Components/FetchRenderProps.js),其中包含如下所示的数据获取逻辑:
import React from "react"; class FetchRenderProps extends React.Component { constructor(props) { super(props); this.state = { data: [] } } componentDidMount() { fetch(this.props.url) .then((response) => response.json()) .then((data) => { console.log(data) this.setState({ data: data }); }); } render() { return ( <div> <h2>Fetch react component</h2> {this.state.data && this.props.render(this.state.data)} </div> ) } } export default FetchRenderProps;
在这里我们:
使用fetch javascript 方法在componentDidMount 事件中从外部 url 获取数据。
使用通过 props 传递的render 方法渲染获取的数据。
接下来,在 public 文件夹中创建一个文件 users.json (public/users.json) 来存储用户信息。我们将尝试使用FetchRenderProps 组件获取它并在我们的应用程序中显示它。
[{"id":1,"name":"Fowler","age":18}, {"id":2,"name":"Donnell","age":24}, {"id":3,"name":"Pall","age":26}]
接下来,在 public 文件夹中创建一个文件 todo_list.json (public/todo_list.json) 来存储待办事项列表信息。我们将尝试使用FetchRenderProps 组件获取它并在我们的应用程序中显示它。
[{"id":1,"title":"Learn JavaScript","is_done":true}, {"id":2,"title":"Learn React","is_done":true}, {"id":3,"title":"Learn Typescript","is_done":false
接下来,创建一个组件 SimpleRenderProps (src/Components/SimpleRenderProps.js) 来使用 FetchRenderProps 组件,如下所示:
import React from "react"; import FetchRenderProps from "./FetchRenderProps"; class SimpleRenderProps extends React.Component { render() { return ( <> <FetchRenderProps url="users.json" render={(items) => ( <ul> {items && items.length && items.map((item) => <li key={item.id}>{item.name}</li> )} </ul> )} /> <FetchRenderProps url="todo_list.json" render={(items) => ( <ul> {items && items.length && items.map((item) => <li key={item.id}>{item.title} {item.is_done && <strong>Done</strong>}</li> )} </ul> )} /> </> ) } } export default SimpleRenderProps;
在这里我们:
使用FetchRenderProps 和 users.json 来获取和渲染用户列表
使用FetchRenderProps 和todo_list.json 来获取和渲染待办事项列表
获取用户和待办事项列表都使用相同的FetchRenderProps 组件。
接下来,打开App.js 文件并渲染一个SimpleRenderProps 组件,如下所示:
import './App.css' import React from 'react'; import SimpleRenderProps from './Components/SimpleRenderProps' function App() { return ( <div className="container"> <div style={{ padding: "10px" }}> <div> <SimpleRenderProps /> </div> </div> </div> ); } export default App;
最后,在浏览器中打开应用程序并检查最终结果。应用程序将按如下所示渲染:
总结
渲染属性是在组件之间共享逻辑的有效方法。它在许多第三方组件中被广泛使用,并取得了良好的成功率,并且它是 React 领域中经时间考验的共享逻辑方法。