深入react组件及事件机制

161 阅读2分钟

关于useState

组件状态的更新是异步的,我们不能在更改状态的函数执行以后不能立刻同步得到更新后的值 想立刻拿到最新状态要用,useEffect/useLayoutEffect

对于useState的写法

可以传入函数,但是尽量不传函数,因为初始化工作只会执行一次

    function change(){
      setTime(time+1)
      setTime(time+1)
    }

此时增加不会是2、4、6、8,而是1、2、3、4、5,因为状态的更新是异步的,如果想要出现增加2、4、6、8的效果可以传入一个函数

    function change(){
      setTime(time=>time+1)
      setTime(time=>time+1)
    }

传入函数,react会把函数放进队列中等待执行,最后按照队列先入先出依次执行函数,这时每次setTime取得值都是最新的值。

react状态更新是批量进行,组件多次状态变更,最后也只会渲染一次

react事件机制

如果有一千个dom元素需要绑定事件,一一绑定,对性能消耗很大,react使用了事件委托的机制,给父级绑定一个事件,event.target指向真正触发事件的人。

react把事件绑定到对应的root元素上,当真实dom触发事件,dom事件会随事件冒泡一直传到root元素上,root对应事件通event.target知道真正触发事件元素,然后再对应触发事件。

在react的jsx语法中的标签绑定事件如

<button onClick ={(e)=>{e.stopPropagation}} >确定</button> 这里的onClick和e都不是原生js,只是标签属性。会交给react进行处理,里面的e也是由react创建的非原生

注意react17以下,如果在异步环境下,e会等于null

react会保存引用只是修改对应属性值e