由于相较于 react,我对 vue 更加熟悉,所以我是用 vue 的生命周期来理解 useEffect 的。
- useEffect 可以代替
- 作为 componentDidMount(mounted)使用。[]作第二个参数
- 作为 componentDidUpdate 使用,可指定依赖(watch),不指定依赖则任何 state 更新都会触发 useEffect(updated)
- 作为 componentWillUnmount(beforeDestroyed)使用,通过 return
测试 useEffect,useLayoutEffect 执行时间,可以发现这两个函数是异步的,执行时间晚于 virtual DOM 形成时间
App()->virtual DOM->DOM树->浏览器渲染节点(render)
- useEffect:afterRender,在 render 之后执行(就是 mounted 嘛,只在第一次 render 后触发 useEffect,之后 render 不触发 useEffect)
- useLayoutEffect:beforeRender,在 render 之前执行
- 优先使用 useEffect(优先渲染,让用户尽快看到渲染好的页面,提升用户体验)