React - 09 setState进阶处理

奋斗吧
奋斗吧
擅长邻域:未填写

标签: React - 09 setState进阶处理 React.js博客 51CTO博客

2023-06-23 18:24:05 139浏览

React - 09 setState进阶处理,this.setState([partialState],[callback])[partialState]:支持部分状态更改this.setState({x:100//不论总共有多少状态,我们只修改了x,其余的状态不动});[callback]:在状态更改/视图更新完毕后触发执行「也可以说只要执行了setStat

React - 09 setState进阶处理_react

this.setState([partialState],[callback])
    [partialState]:支持部分状态更改
        this.setState({
            x:100 //不论总共有多少状态,我们只修改了x,其余的状态不动
        });
    [callback]:在状态更改/视图更新完毕后触发执行「也可以说只要执行了setState,callback一定会执行」
        + 发生在componentDidUpdate周期函数之后「DidUpdate会在任何状态更改后都触发执行;而回调函数方式,可以在指定状态更新后处理一些事情;」
        + 特殊:即便我们基于shouldComponentUpdate阻止了状态/视图的更新,DidUpdate周期函数肯定不会执行了,但是我们设置的这个callback回调函数依然会被触发执行!!
        + 类似于Vue框架中的$nextTick!!

 在React18中,setState操作都是异步的「不论是在哪执行,例如:合成事件、周期函数、定时器...」
   目的:实现状态的批处理「统一处理」
     + 有效减少更新次数,降低性能消耗
     + 有效管理代码执行的逻辑顺序
     + ...
   原理:利用了更新队列「updater」机制来处理的
     + 在当前相同的时间段内「浏览器此时可以处理的事情中」,遇到setState会立即放入到更新队列中!
     + 此时状态/视图还未更新
     + 当所有的代码操作结束,会“刷新队列”「通知更新队列中的任务执行」:把所有放入的setState合并在一起执行,只触发一次视图更新「批处理操作」

React - 09 setState进阶处理_react_02

React - 09 setState进阶处理_react_03

在React18 和 React16中,关于setState是同步还是异步,是有一些区别的!
    React18中:不论在什么地方执行setState,它都是异步的「都是基于updater更新队列机制,实现的批处理」
    React16中:如果在合成事件「jsx元素中基于onXxx绑定的事件」、周期函数中,setState的操作是异步的!!但是如果setState出现在其他异步操作中「例如:定时器、手动获取DOM元素做的事件绑定等」,它将变为同步的操作「立即更新状态和让视图渲染」!!

React16

React - 09 setState进阶处理_react_04

React18

React - 09 setState进阶处理_react_05

React - 09 setState进阶处理_react_06

React - 09 setState进阶处理_react_07

这样写,渲染一次,x结果是1

React - 09 setState进阶处理_react_08

使用flushSync,这两种方式都行,渲染20次,x最后结果是20

React - 09 setState进阶处理_react_09

想渲染一次,让x结果是20

React - 09 setState进阶处理_react_10

React - 09 setState进阶处理_react_11

两者的执行区别

React - 09 setState进阶处理_react_12

好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

客服QQ 1913284695