📄React 实现 ComponentWillMount

type
status
date
slug
summary
tags
category
icon
password
Status

ComponentWillMout钩子

众所周知,React 生命周期中有一个 componentWillMount,不过目前已经被 React 标记为过时了(它在 React 中仍然可以用,但官方不建议使用)。该钩子是在 DOM 挂载之前调用,我们可以利用它在组件初始化渲染之前做一些事情。
But, componentWillMount 有一个很明显的缺陷,就是此钩子在页面初始化渲染之前会执行一次或多次,这并不是我们想要的,并且,我们可以利用 constructor() 来替代 componentWillMount
因此,目前该钩子正慢慢被 React 移除,官方表示,componentWillMount 只能继续使用至 React 17,这就是说到了 React18 就不能用了。

为什么不是useLayoutEffect

useLayoutEffect 的出现是为了解决 useEffect 的页面闪烁问题。useEffect 是在组件挂载后异步执行的,并且执行事件会更加往后,如果我们在 useEffect 里面改变 state 状态,那么页面会出现闪烁(state 可见性变化导致的)。而 useLayoutEffect 是在渲染之前同步执行的(准确的说,uselayout在渲染之前是其在commit阶段之前执行,因为当前的DOM树在内存中还没有挂载到root上面),在这里执行修改 DOM 相关操作,就会避免页面闪烁的情况。
notion image
 
一般的渲染流程:
  1. React 前面的步骤:渲染虚拟 Dom,调度 effects,更新真实DOM
  1. 调用 useLayoutEffect
  1. React 让权给浏览器重绘最新的 DOM
  1. 调用 useEffect
在 React Hook 中,函数组件并没有 constructor 的概念,我们大多数是通过 useEffect 来模拟组件的生命周期,比如componentDidMount 和 componentWillUnMount
  • componentDidMount:当组件挂载完成之后调用,一般用来监听浏览器事件、请求接口加载数据
  • componentWillUnMount:在组件销毁之前调用,通常是用来做一些清除动作,比如移除事件监听、清除定时器等等
我们可以利用 useEffect 来这么实现这两个生命周期:
值得注意的是,这并不能完全等同于 componentWillMount,因为存在代码顺序带来的问题,比如:
在这里,111 会在 useComponentWillMount 之前执行,而 class 的 componentWillMount 中,是优先其他代码执行的。
  • Twikoo

© 2021-2024 Tabing | 萌ICP备20240819号