React--setState部分详解

147 阅读2分钟

setState

vue对数据管理和界面渲染的流程解析
React对数据管理和界面渲染的流程解析
对Vue和React的对比

使用setState理由:

React并没有实现类似Vue2中的Object.defineProperty 或者Vue3的Proxy的方式监听数据的变化。所以需要通过setState来告诉React数据发生了变化。
setState是从Component中继承过来的。

详细使用

1.基本使用

2.传入一个回调函数: 在回调函数中编写新的state逻辑 当前的回调函数可以将之前的state和props传递进来

3.异步使用 : setState 方法其实是 “异步” 的。即立马执行之后,是无法直接获取到最新的 state 的,需要经过 React 对 state 的所有改变进行合并处理之后,才会去计算新的虚拟dom,再根据最新的虚拟dom去重新渲染真实dom。

处理方式

React 其实会维护着一个 state 的更新队列,每次调用 setState 都会先把当前修改的 state 推进这个队列,在最后,React 会对这个队列进行合并处理,然后去执行回调。根据最终的合并结果再去走下面的流程(更新虚拟dom,触发渲染)。

异步理解

setState并不是真正意义上的异步操作,它只是模拟了异步的行为。React中会去维护一个标识(isBatchingUpdates),判断是直接更新还是先暂存state进队列。setTimeout以及原生事件都会直接去更新state,因此可以立即得到最新state。而合成事件和React生命周期函数中,是受React控制的,其会将isBatchingUpdates设置为 true,从而走的是类似异步的那一套。 1.显著提升性能(批处理获取多个更新) 2.如果同步更新了state,但是还没有执行render函数,那么state和props不能保持同步 3. setState 在 React合成事件以及组件生命周期里面“异步”,在原生dom事件以及SetTimeout里面是同步的

setState不一定是异步 (React18之前)

setState默认是异步 (React18之后)

在React18之后,默认所有操作在批处理中

不使用批处理: flushSync(()=> {this.setStae()}) 变成同步操作