视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
react的setSate的异步问题的分析
2020-11-27 19:27:00 责编:小采
文档

本篇文章给大家带来的内容是关于react的setSate的异步问题的分析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

在我们阅读文档的时候,大多都说react的setState是异步的,可是它真的是异步的吗?如果是,那我们还可以猜想:那可以不可以同步?那什么时候需要异步,什么时候需要同步呢?

我们先来看下react的官方对setSate的说明:

将setState()认为是一次请求而不是一次立即执行更新组件的命令。为了更为可观的性能,React可能会推迟它,稍后会一次性更新这些组件。React不会保证在setState之后,能够立刻拿到改变的结果。

一个很经典的例子:

// 初始state.count 当前为 0
componentDidMount(){
 this.setState({count: state.count + 1});
 console.log(this.state.count)
}

如果你熟悉react,你一定知道最后的输出结果是0,而不是1。

我们再来看一个例子

class Demo extends Component {
 constructor(props) {
 super(props);
 this.state = { number: 0 };
 }
 render() {
 return <button ref="button" onClick={this.onClick.bind(this)}>点我</button>;
 }
 componentDidMount() {
 //手动绑定mousedown事件
 this.refs.button.addEventListener(
 "mousedown",
 this.onClick.bind(this)
 );
 
 //setTimeOut
 setTimeout(this.onClick.bind(this), 1000);
 }
 onClick(event) {
 if (event) {
 console.log(event.type);
 } else {
 console.log("timeout");
 }
 console.log("prev state:", this.state.number);
 this.setState({
 number: this.state.number + 1
 });
 console.log("next state:", this.state.number);
 }
}
export {Demo};

在这个组件中采用3中方法更新state

 1.在p节点中绑定onClick事件
 2.在componentDidMount中手动绑定mousedown事件
 3.在componentDidMount中使用setTimeout调用onClick

在点击组件后,你可以猜到结果吗?输出结果是:

timeout
prev state: 0
next state: 1
mousedown
prev state: 1
next state: 2
click
prev state: 2
next state: 2

结果似乎有点出人意料,三种方式只有在p上绑定的onClick事件输出了可以证明setState是异步的结果,另外两种方式显示setState似乎是同步的。

总结:
1.在组件生命周期中或者react事件绑定中,setState是通过异步更新的。
2.在延时的回调或者原生事件绑定的回调中调用setState不一定是异步的。

这个结果并不说明setState异步执行的说法是错误的,更加准确的说法应该是setState不能保证同步执行。

本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的JavaScript视频教程栏目!

下载本文
显示全文
专题