React生命周期可概括为以下关键阶段(针对类组件,函数组件重要通过Hooks实现雷同功能):
挂载(Mounting):
constructor:初始化state和绑定事件处置处罚函数。
render:返回组件的UI表示。
componentDidMount:组件挂载到DOM后执行,得当引入任何需要DOM节点的初始化工作(如网络请求、订阅等)。
更新(Updating):
render:重新渲染组件。
componentDidUpdate:在更新发生后立即调用,可以执行DOM操作或更新数据。
shouldComponentUpdate:决定组件是否应该更新,返回布尔值。
getDerivedStateFromProps:在更新前调用,用于在props变化时更新state。
卸载(Unmounting):
componentWillUnmount:在组件卸载和烧毁之前调用,用于执行必要的清算操作(如取消网络请求、移除订阅等)。
错误处置处罚(Error Handling):
getDerivedStateFromError 或 componentDidCatch:捕获子组件树中的错误并执行反应。
注意:React 16引入的Fiber架构和React 18的Concurrent Mode对生命周期有一定影响,部分生命周期方法被标志为不推荐使用(如componentWillMount、componentWillReceiveProps、componentWillUpdate),建议使用getDerivedStateFromProps、componentDidMount、shouldComponentUpdate和新的getSnapshotBeforeUpdate等方法进行替代。
React Hook 是 React 16.8 版本引入的一项特性,它答应在函数组件中使用状态(state)、生命周期方法、副作用等 React 的特性,而无需编写类组件。Hook 的重要目标是让函数组件具备了更多类组件的功能,同时让代码更加清楚、简洁,并且更容易复用逻辑。
React Hook 的重要特点
状态管理:Hook 使得函数组件能够拥有状态。在 React 16.8 之前,函数组件是无状态的,只能接收 props 并返回 JSX。通过引入 useState Hook,函数组件可以拥有自己的状态。
副作用处置处罚:useEffect Hook 用于在函数组件中执行副作用操作,如数据获取、订阅和手动更改 React 组件的 DOM 输出等。它雷同于类组件中的 componentDidMount、componentDidUpdate 和 componentWillUnmount 生命周期方法的组合。
自定义 Hook:开辟者可以创建自定义的 Hook,用于在组件之间复用状态逻辑或其他逻辑。自定义 Hook 是一个以 use 开头的函数,它内部可以调用其他 Hook。
React 常用 Hook
useState:用于在函数组件中添加状态管理。它接收一个初始状态作为参数,并返回一个状态值和一个用于更新这个状态的函数。
示例代码:
jsx
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
const increment = () => {
setCount(count + 1);
};
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
</div>
);
}
useEffect:用于在函数组件中执行副作用操作。它接收一个函数作为参数,该函数在组件渲染到屏幕后执行。useEffect 还可以返回一个清算函数,用于在组件卸载时执行清算操作,如取消订阅、移除事件监听器等。
示例代码:
jsx
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `You clicked ${count} times`;
return () => {
// 清算工作
};
}, [count]); // 仅当 count 变化时执行副作用
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>Click me</button>
</div>
);
}
useContext:用于在函数组件中订阅 React 的上下文(context)。它通过接收一个上下文对象作为参数,并返回该上下文的当前值。这使得跨组件共享数据变得更加容易。
useRef:用于在函数组件中创建和访问 ref。它返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数(initialValue)。useRef 返回的 ref 对象在组件的整个生命周期内保持稳定。
useReducer:是 useState 的另一种情势,它实用于管理更复杂的组件状态逻辑。useReducer 接收一个 reducer 函数和一个初始状态作为参数,并返回一个状态值和一个用于更新状态的 dispatch 方法。
React Hook 的优势
代码重用:通过自定义 Hook,可以在差别的组件之间复用状态逻辑和其他逻辑。
逻辑与 UI 分离:Hook 使得组件逻辑更加清楚,有助于将 UI 渲染逻辑与状态更新逻辑分离。
减少类组件的使用:随着 Hook 的引入,函数组件变得更增强大,减少了对类组件的需求,使得 React 组件的编写更加灵活和简洁。
总之,React Hook 是 React 框架中的一项重要特性,它极大地扩展了函数组件的功能和灵活性,使得 React 应用程序的开辟变得更加高效和便捷。
当然可以。下面我将给出一个React Hooks的应用实例,该实例将演示怎样在函数组件中使用useState和useEffect Hooks来创建一个简单的计数器组件,该组件会在组件挂载后每秒主动增加计数,并答应用户通过按钮手动增加计数。
计数器组件示例
jsx
import React, { useState, useEffect } from 'react';
function Counter() {
// 使用useState Hook声明一个名为count的状态变量,并初始化为0
const [count, setCount] = useState(0);
// 使用useEffect Hook来处置处罚副作用
// 这个副作用将在组件挂载后每秒执行一次,用于更新count状态
useEffect(() => {
// 设置一个定时器,每秒调用一次
const intervalId = setInterval(() => {
// 更新状态
setCount(prevCount => prevCount + 1);
}, 1000);
// 返回一个清算函数,用于在组件卸载时扫除定时器
return () => {
clearInterval(intervalId);
};
}, []); // 空依靠数组意味着这个effect只在组件挂载时运行一次
// 定义一个处置处罚按钮点击的函数
const handleIncrement = () => {
// 更新状态
setCount(prevCount => prevCount + 1);
};
// 返回组件的JSX表示
return (
<div>
<p>Count: {count}</p>
<button onClick={handleIncrement}>Increment</button>
</div>
);
}
export default Counter;
解析
useState Hook:用于在函数组件中添加状态。在这个例子中,我们创建了一个名为count的状态变量,并通过setCount函数来更新它的值。
useEffect Hook:用于在函数组件中处置处罚副作用。在这个例子中,我们使用了useEffect来设置一个定时器,每秒调用一次,每次调用时都会通过setCount函数来更新count的状态。我们还返回了一个清算函数,用于在组件卸载时扫除定时器,制止内存泄漏。
组件渲染:每当count的状态更新时,组件都会重新渲染,表现最新的计数。
按钮交互:用户可以通过点击按钮来触发handleIncrement函数,该函数将调用setCount函数来手动增加计数。
这个示例展示了React Hooks的强大功能,使得函数组件能够处置处罚状态和生命周期,同时保持代码的简洁性和可读性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |