- 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 - 渲染 Props
- 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 Hooks 的组件生命周期
React Hooks 提供了一个特殊的 Hook,useEffect(),用于在组件的生命周期中执行某些功能。useEffect() 将componentDidMount、componentDidUpdate 和componentWillUnmount 生命周期合并到单个 API 中。
useEffect() API 的签名如下:
useEffect( <executeFn>, <values> );
这里,
executeFn - 在发生效果时执行的函数,并带有可选的返回函数。返回函数将在需要清理时执行(类似于componentWillUnmount)。
values - 效果依赖的值数组。React Hooks 仅在值更改时执行executeFn。这将减少不必要的executeFn 调用。
让我们在我们的 react-clock-hook-app 应用程序中添加useEffect() Hooks。
在您喜欢的编辑器中打开react-clock-hook-app。
接下来,打开 src/components/Clock.js 文件并开始编辑。
接下来,导入useEffect API。
import React, { useState, useEffect } from 'react';
接下来,使用函数调用useEffect,以使用setInterval 每秒设置日期和时间,并返回一个函数以使用clearInterval 停止更新日期和时间。
useEffect( () => { let setTime = () => { console.log("setTime is called"); setCurrentDateTime(new Date()); } let interval = setInterval(setTime, 1000); return () => { clearInterval(interval); } }, [] );
这里,
创建了一个函数setTime,用于将当前时间设置为组件的状态。
调用了setInterval JavaScript API 以每秒执行setTime,并将setInterval 的引用存储在interval 变量中。
创建了一个返回函数,该函数调用clearInterval API 通过传递interval 引用来停止每秒执行setTime。
现在,我们已经更新了 Clock 组件,组件的完整源代码如下:
import React, { useState, useEffect } from 'react'; function Clock() { const [currentDateTime, setCurrentDateTime] = useState(new Date()); useEffect( () => { let setTime = () => { console.log("setTime is called"); setCurrentDateTime(new Date()); } let interval = setInterval(setTime, 1000); return () => { clearInterval(interval); } }, [] ); return ( <div> <p>The current time is {currentDateTime.toString()}</p> </div> ); } export default Clock;
接下来,打开index.js 并使用setTimeout 在 5 秒后从 DOM 中移除时钟。
import React from 'react'; import ReactDOM from 'react-dom'; import Clock from './components/Clock'; ReactDOM.render( <React.StrictMode> <Clock /> </React.StrictMode>, document.getElementById('root') ); setTimeout(() => { ReactDOM.render( <React.StrictMode> <div><p>Clock is removed from the DOM.</p></div> </React.StrictMode>, document.getElementById('root') ); }, 5000);
接下来,使用 npm 命令启动应用程序。
npm start
接下来,打开浏览器并在地址栏中输入https://127.0.0.1:3000 并按 Enter。
时钟将显示 5 秒,然后从 DOM 中移除。通过检查控制台日志,我们可以发现清理代码已正确执行。
React children 属性,也称为包含
React 允许在组件内部包含任意子用户界面内容。可以通过this.props.children 访问组件的子元素。在组件内部添加子元素称为包含。包含用于组件的某些部分本质上是动态的情况。
例如,富文本消息框在被调用之前可能不知道其内容。让我们在本节中创建一个RichTextMessage 组件来展示 React children 属性的功能。
首先,使用Create React App 或Rollup bundler 创建一个新的 React 应用程序react-message-app,方法是按照创建 React 应用程序章节中的说明进行操作。
接下来,在您喜欢的编辑器中打开应用程序。
接下来,在应用程序的根目录下创建src 文件夹。
接下来,在src 文件夹下创建components 文件夹。
接下来,在src/components 文件夹下创建一个文件RichTextMessage.js 并开始编辑。
接下来,导入React 库。
import React from 'react';
接下来,创建一个类RichTextMessage 并使用 props 调用构造函数。
class RichTextMessage extends React.Component { constructor(props) { super(props); } }
接下来,添加render() 方法并显示组件的用户界面及其子元素
render() { return ( <div>{this.props.children}</div> ) }
这里,
props.children 返回组件的子元素。
将子元素包装在div 标签内。
最后,导出组件。
export default RichTextMessage;
下面给出了RichTextMessage 组件的完整源代码:
import React from 'react'; class RichTextMessage extends React.Component { constructor(props) { super(props); } render() { return ( <div>{this.props.children}</div> ) } } export default RichTextMessage;
接下来,在src 文件夹下创建一个文件index.js 并使用RichTextMessage 组件。
import React from 'react'; import ReactDOM from 'react-dom'; import RichTextMessage from './components/RichTextMessage'; ReactDOM.render( <React.StrictMode> <RichTextMessage> <h1>Containment is really a cool feature.</h1> </RichTextMessage> </React.StrictMode>, document.getElementById('root') );
最后,在根文件夹下创建一个public 文件夹,并在其中创建index.html 文件。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>React App</title> </head> <body> <div id="root"></div> <script type="text/JavaScript" src="./index.js"></script> </body> </html>
接下来,使用 npm 命令启动应用程序。
npm start
接下来,打开浏览器并在地址栏中输入https://127.0.0.1:3000 并按 Enter。
浏览器发出用 div 标签包装的组件子元素,如下所示:
<div id="root"> <div> <div> <h1>Containment is really a cool feature.</h1> </div> </div> </div>
接下来,更改index.js 中RichTextMessage 组件的子属性。
import React from 'react'; import ReactDOM from 'react-dom'; import Clock from './components/Clock'; ReactDOM.render( <React.StrictMode> <RichTextMessage> <h1>Containment is really an excellent feature.</h1> </RichTextMessage> </React.StrictMode>, document.getElementById('root') );
现在,浏览器更新组件的子内容并发出如下所示:
<div id="root"> <div> <div> <h1>Containment is really an excellent feature.</h1> </div> </div> </div>
简而言之,包含是一个将任意用户界面内容传递给组件的优秀功能。