react之setState与useState

1,641 阅读2分钟
- 函数组件中状态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合成的事件中 image.png image.png image.png

    • 同步: 在setTimeout 或者 原生DOM事件中 image.png

      注:在setTimeout 或者 原生DOM事件中为什么setState操作会是同步的呢?

      f

  • setState的合并
    • setState的合并,从源码中可看出setState会将上一个state对象与当前传入的state进行合并更新 image.png

    • 多次调用合并:当多次调用了setState时,只会生效最后一次state(每调用一次setState,就相当于调用一次render函数进行一次页面重绘渲染,setState多次调用合并这一特性避免了页面的频繁渲染,有利于性能优化) image.png

useState

useState的实现调用