面试了许多求职者,很多求职者只知其然,而不知所以然,写此文章为广大前端小伙伴指引迷津。纯干货!纯干货!纯干货!
目录
setState
setState
答:是 React 中用于修改状态,更新视图的方法。。
setState 过程??
在代码中调用 setState 之后,React 会将传入的参数对象与组件当前的状态合并,触发所谓的调和过程(Reconciliation)。
经过调和过程,React 会以相对高效的方式根据新的状态构建 React 元素树并且着手重新渲染整个 UI 界面。
在 React 得到元素树之后,React 会自动计算新树和老树之间的节点差异,然后根据差异对界面进行最小化重新渲染。
在差异计算算法(Diff)中,React 能够相对精确地知道哪些位置发生了改变以及英国如何改变,保证了按需更新,而不是全部重新渲染。
简单来说:
- 合并参数对象,触发调和过程
- 计算新树和老树差异(
Diff) - 根据差异进行最小化重新渲染
setState 是同步还是异步?
答:有时候同步,有时候异步。
setState在合成事件和钩子函数中是异步的,在原生事件和setTimeout是同步的。setState的异步,并不是说内部由异步代码实现,它本身执行的过程和代码是同步的,只是合成事件和钩子函数的调用顺序在更新之前,导致在合成事件和钩子函数中没法立马拿到更新后的值,从而形成了所谓的异步。
解决setState数据问题?
// 回调函数
this.setState(
{
count: count + 1
},
() => {
console.log(this.state.count);
}
);
// componentDidUpdate
import React, { PureComponent } from 'react';
class Demo extends PureComponent {
state = {
count: 0
}
componentDidUpdate() {
const { count } = this.state;
console.log(count);
}
click = () => {
const { count } = this.state;
this.setState({
count: count + 1
});
}
render() {
const { count } = this.state;
return (
<div>
<button onClick={this.click}>+1</button>
<div>{count}</div>
</div>
);
}
}
export default Demo;