关于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