生命周期
Class 中的生命周期
这里主要讲述react16.4之后的生命周期,可以分成三个阶段:
Mounting 阶段
这个阶段涉及到组件的初始化和第一次渲染。
constructor():组件实例化时调用
用于初始化 state 获取路由信息
绑定事件处理函数、比如绑定 this , 节流,防抖等。
getDerivedStateFromProps(nextProps,prevState):在 render() 方法之前调用。(componentWillMount被这个代替了)
用于根据 props 计算 state。
可以props 进行格式化,过滤等。
返回一个对象去更新state,可作为shouldComponentUpdate 第二个参数 newState。
render():渲染组件,必须实现。
createElement创建元素 , cloneElement 克隆元素 ,React.children 遍历 children 的操作。
componentDidMount():在组件第一次渲染后调用,用于执行一些初始化操作。
AJAX 请求数据。
DOM 操作,DOM 事件监听器。
Updating 阶段
这个阶段涉及到组件被重新渲染的情况,如 props 或 state 的改变。
getDerivedStateFromProps():同上。(componentWillReceiveProps被这个代替了,componentWillUpdate也可以理解被这个代代替是在shouldComponentUpdate之后执行的) shouldComponentUpdate(newProps,newState,nextContext):在 render() 方法之前调用,用于确定组件是否需要重新渲染。
返回
true则组件重新渲染,返回false则组件不渲染
render():同上。
getSnapshotBeforeUpdate(prevProps,preState) :在 render() 方法之后、更新 DOM 之前调。(代替了componentWillUpdate)
用于获取当前 DOM 的快照,比如 DOM 元素位置等。
将返回一个值作为一个snapShot,传递给 componentDidUpdate作为第三个参数。
componentDidUpdate(prevProps, prevState, snapshot):在组件更新后调用,可以获取 DOM 最新状态。
Unmounting 阶段
这个阶段涉及到组件被卸载的情况。
componentWillUnmount():在组件被卸载前调用。
用于清除计时器、取消网络请求、清除事件监听器。
Hook生命周期
useInsertionEffect
DOM 更新之前执行。
解决 CSS-in-JS 在渲染中注入样式的性能问题,例如在useLayoutEffect 动态生成 style 标签,可能会导致浏览器再次重回和重排。
useLayoutEffect
在 DOM 更新之后,浏览器绘制之前同步执行(requestAnimationFrame)。
件渲染完成后同步执行,会阻塞浏览器的渲染进程。
适合操作DOM,改变布局。通常用于执行一些需要更新页面的操作,例如更新动画或调整元素位置和大小等。
useEffect
用于在组件渲染后执行一些操作,可以模拟 componentDidMount、componentDidUpdate 和 componentWillUnmount 生命周期。
第一个参数 callback: callback 和 setTimeout回调函数一样,放入任务队列,等到主线程任务完成,DOM 更新,js 执行完成,视图绘制完毕,才执行。
组件渲染完成后异步执行,不会阻塞浏览器的渲染进程。
可以进行AJAX 请求数据
获取DOM,DOM 事件监听器。
不推荐DOM 操作,浏览器再次回流和重绘,视图上可能会造成闪现突兀的效果。
第一个参数 callback返回方法destory:下一次callback执行前执行或者组件卸载前执行。
用于清除计时器、取消网络请求、清除事件监听器。
第二个参数作为依赖项:是一个数组,可以有多个依赖项。
依赖项改变,执行上一次callback返回值destory方法,然后执行callback。
当依赖为[]时,初始化执行一次。当没有依赖时,每一次执行函数组件,都会执行该 effect。
Demo详解
在使用 React Hooks 的函数组件中,没有生命周期方法,但是可以使用一些与生命周期相关的 Hooks,如 useEffect、useLayoutEffect、useMemo 等。下面是一个示例组件,演示了 React Hooks 中的生命周期相关 Hooks 和它们的顺序:
上述组件包含了以下 Hooks:
useState: 用于定义组件的状态。 useEffect: 用于在组件渲染后执行一些操作,可以模拟 componentDidMount、componentDidUpdate 和 componentWillUnmount 生命周期。 useLayoutEffect: 与 useEffect 类似,但会在浏览器绘制之前同步执行。 useMemo: 用于缓存计算结果,避免重复计算,类似于 shouldComponentUpdate 生命周期。 我们可以通过在控制台打印各个 Hooks 的名称,来查看它们的顺序和调用次数。注意,由于 Hooks 可能会被多次调用,因此它们可能会在不同的时间调用多次,而不像生命周期方法那样只调用一次。
Last updated