- 函数组件中状态state的变化通过调用hook useState 进行更新存储;
- 类组件中通过调用setState来进行更新存储
setState
使用setState的原因
开发中无法直接通过修改state的值来让界面更新
- 修改
state之后,希望React根据最新的state重新渲染页面,但是这种方式的修改,React无法得知state的变化,亦都没办法重新渲染;React中没有类似Vue2中的Object.defineProperty或者Vue3中的Proxy的方式监听数据的变化;因此必须通过setState来告知React数据已经发生了变化。
setState的实现调用
setState方法是从Component类中继承过来的
异步更新的setState
- 设计为异步更新的原因
- 可以显著的提高性能: 若每次调用都会被界面重新渲染,效率极低,通过获取多个更新之后,进行批量的更新
- 同步更新state但未执行render函数,则state与props无法保持一致,将导致诸多开发问题
- 获取异步更新的结果
- setState的回调函数: setState(newState, callback)接收两个参数,回调函数会在state更新之后执行。
- componentDidUpdate生命周期函数
- setState一定是异步的吗?
实际可分为两种结果-
异步: 在组件内生命周期内 或者 React合成的事件中
-
同步: 在setTimeout 或者 原生DOM事件中
注:
在setTimeout 或者 原生DOM事件中为什么setState操作会是同步的呢?f
-
- setState的合并
-
setState的合并,从源码中可看出setState会将上一个state对象与当前传入的state进行合并更新
-
多次调用合并:当多次调用了setState时,只会生效最后一次state(每调用一次setState,就相当于调用一次render函数进行一次页面重绘渲染,setState多次调用合并这一特性避免了页面的频繁渲染,有利于性能优化)
-
useState
useState的实现调用