返回
理解 React 的生命周期钩子
前端
2023-09-16 04:51:02
React 的生命周期钩子是允许你管理组件生命周期不同阶段的钩子函数。生命周期钩子通常用于在组件挂载、更新和卸载期间执行特定代码。在 React 中,有两种主要类型生命周期钩子:旧版钩子和新版钩子。
旧版钩子在 React 16.3 之前使用,包括:
componentWillMount
:在组件挂载之前调用componentDidMount
:在组件挂载之后调用componentWillReceiveProps
:在组件收到新属性之前调用shouldComponentUpdate
:在组件收到新属性或状态时调用,决定是否更新组件componentWillUpdate
:在组件更新之前调用componentDidUpdate
:在组件更新之后调用componentWillUnmount
:在组件卸载之前调用
新版钩子在 React 16.3 之后引入,包括:
useEffect
:用于副作用,如数据获取和设置定时器useLayoutEffect
:用于在 DOM 更新之前执行副作用useCallback
:返回一个缓存的回调函数useMemo
:返回一个缓存的值useReducer
:管理状态,类似于 ReduxuseContext
:访问父组件的上下文useRef
:返回一个可变的引用,可以在组件中使用
在新版本中,React 新增了两个生命周期钩子:
getDerivedStateFromProps
:在组件首次挂载或接收到新属性时调用,用于更新组件状态。getSnapshotBeforeUpdate
:在组件更新之前调用,用于在 DOM 更新之前获取快照。
getDerivedStateFromProps
用于在组件首次挂载或接收到新属性时更新组件状态。它接收两个参数:新的属性和当前的状态。它应该返回一个对象,其中包含要更新的状态。
getDerivedStateFromProps(nextProps, prevState) {
// 如果nextProps.count与prevState.count不同,则更新状态
if (nextProps.count !== prevState.count) {
return {
count: nextProps.count
};
}
// 否则,返回null
return null;
}
getSnapshotBeforeUpdate
用于在组件更新之前获取快照。它接收两个参数:当前的属性和当前的状态。它应该返回一个值,该值将在组件更新之后传递给 componentDidUpdate
。
getSnapshotBeforeUpdate(prevProps, prevState) {
// 获取DOM节点的滚动位置
const scrollPosition = window.scrollY;
// 返回滚动位置
return scrollPosition;
}
旧版和新版钩子各有优势。旧版钩子更易于理解和使用,而新版钩子则更灵活和强大。在实际开发中,你可以根据自己的需求选择使用哪种钩子。
除了生命周期钩子之外,React 还提供了其他一些方法来管理组件的生命周期,包括:
constructor
:在组件实例化时调用render
:在组件挂载或更新时调用,返回组件的 HTML 结构componentDidCatch
:在组件中发生错误时调用
通过使用这些方法,你可以完全控制组件的生命周期,并编写出更健壮和可维护的 React 应用程序。