React之ReactHook与生命周期

简介: React之ReactHook与生命周期

useEffect


useEffect第一个参数为callback,返回destory,destory作为下一次callback执行前调用,用于清除上一次callback产生的副作用。


第二个参数为依赖项,是一个数组,可以有多个依赖性,依赖项改变,执行上一次callback返回的destory,和执行新的effect第一个参数callback。


对于 useEffect 执行, React 处理逻辑是采用异步调用 ,对于每一个 effect 的 callback, React 会向 setTimeout回调函数一样,放入任务队列,等到主线程任务完成,DOM 更新,js 执行完成,视图绘制完毕,才执行。所以 effect 回调函数不会阻塞浏览器绘制视图。


useLayoutEffect


useLayoutEffect 与useEffect 不同的是,它采用的是同步执行。


useLayoutEffect是在DOM更新之后,游览器绘制之前,(也就是说,它执行的时候,DOM是已经更新了的,只不过游览器还没有绘制)这样可以方便修改DOM,获取DOM信息,但是这样游览器只会绘制一次,如果修改DOM布局放在useEffect,那么useEffect执行是在游览器绘制试图之后,接下来又改DOM,就可能会导致游览器再次回流跟重绘。


uselayoutEffect 的 callback中代码执行会阻塞游览器绘制



useEffect 和 useLayoutEffect的区别: 修改DOM,改变布局就用useLayoutEffect,其它全用useEffect。


问: useEffect 与 componentDIdMout 以及 componentDidUpdate执行时机有什么样的区别?


答:useEffect对react是异步执行,而componentDIdMount 以及 componentDidUpdate是同步执行。useEffect不会阻塞游览器绘制。


useInsertionEffect - react 18 新hook


useInsertionEffect的出现,本质上是为了解决css-in-js 在渲染中注入样式的性能问题。


它的执行是高于useLayoutEffect的。它执行的时候,DOM还没有更新。


它的产生是基于如下条件:


useLayoutEffect执行的时候DOM已经更新完成了,布局也是已经确定了,剩下的就是交给游览器绘制。


如果在useLayoutEffect动态生成style标签,那么会再次影响布局,导致游览器再次重回和重排。


这时候useInsertionEffect 就出现了,它的执行是在DOM更新之前,所以此时使用css-in-js避免了游览器再次出现重回重排的可能。


模拟:

5e2d3feece0a40dbb0f08affe65c9f87.png

效果:

页面初始化执行-useEffect
useEffect(() => {
    // 请求数据,事件监听,操纵dom
},[])
页面卸载执行 - use Effect+ componentWillUnmount
useEffect(() => {
    return function componentWillUnmount(){
        // 解除事件监听,清除计时器,延时器。
    }
},[])
组件更新完成
useEffect(() => {
    console.log("组件更新完成")
})

生命周期模拟代码

import React,{useState} from "react"
function FunctionLifecycle(props){
    const [ num , setNum ] = useState(0)
    React.useEffect(()=>{
        /* 请求数据 , 事件监听 , 操纵dom  , 增加定时器 , 延时器 */
        console.log('组件挂载完成:componentDidMount')
        return function componentWillUnmount(){
            /* 解除事件监听器 ,清除 */
            console.log('组件销毁:componentWillUnmount')
        }
    },[])/* 切记 dep = [] */
    React.useEffect(()=>{
        console.log('props变化:componentWillReceiveProps')
    },[ props ])
    React.useEffect(()=>{ /*  */
        console.log(' 组件更新完成:componentDidUpdate ')
    })
    return <div>
        <div> props : { props.number } </div>
        <div> states : { num } </div>
        <button onClick={ ()=> setNum(state=>state + 1) }   >改变state</button>
    </div>
}
// eslint-disable-next-line import/no-anonymous-default-export
export default ()=>{
    const [ number , setNumber ] = React.useState(0)
    const [ isRender , setRender ] = React.useState(true)
    return <div>
        { isRender &&  <FunctionLifecycle number={number}  /> }
        <button onClick={ ()=> setNumber(state => state + 1 ) } > 改变props  </button> <br/>
        <button onClick={()=> setRender(false) } >卸载组件</button>
    </div>
}


目录
相关文章
|
4月前
|
前端开发 JavaScript
React 组件生命周期
React 组件生命周期
40 0
|
3月前
|
前端开发 JavaScript
react 组件的生命周期
React组件的生命周期包括从创建到销毁的各个阶段,如挂载(mounting)、更新(updating)和卸载(unmounting)。每个阶段都有特定的方法,用于控制组件的行为和状态,确保高效、有序地渲染和管理UI。
|
5月前
|
前端开发 JavaScript 开发者
介绍一下React生命周期
介绍一下React生命周期
123 9
|
4月前
|
存储 前端开发 JavaScript
深入理解React组件的生命周期与Hooks
【10月更文挑战第7天】深入理解React组件的生命周期与Hooks
185 0
|
6月前
|
前端开发 JavaScript
React的生命周期演示-新(12)
【8月更文挑战第15天】React的生命周期演示-新
58 5
React的生命周期演示-新(12)
|
6月前
|
前端开发 JavaScript
React的生命周期简介(十)
【8月更文挑战第15天】React的生命周期简介
59 2
|
6月前
|
前端开发 JavaScript
React 组件的生命周期阶段详解
【8月更文挑战第30天】
59 7
|
5月前
|
前端开发 API UED
React组件生命周期详解
【9月更文挑战第4天】在React应用开发中,掌握组件生命周期对于管理状态和属性至关重要,并能有效提升应用性能。本文详细介绍了React组件生命周期的三个阶段:挂载、更新和卸载,并通过代码示例展示了如何避免状态更新导致的死循环及优化网络请求等问题,帮助开发者构建更高效、可维护的应用。
112 2
|
6月前
|
前端开发 JavaScript
React 组件生命周期方法详解
【8月更文挑战第30天】
84 5
|
6月前
|
前端开发 JavaScript
React的生命周期演示-旧(11)
【8月更文挑战第15天】React的生命周期演示-旧(11)
41 3