react的setSate的异步问题的分析


本文摘自PHP中文网,作者不言,侵删。

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

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

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

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

一个很经典的例子:

1

2

3

4

5

// 初始state.count 当前为 0

componentDidMount(){

    this.setState({count: state.count + 1});

    console.log(this.state.count)

}

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

我们再来看一个例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

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

2

3

1.在p节点中绑定onClick事件

2.在componentDidMount中手动绑定mousedown事件

3.在componentDidMount中使用setTimeout调用onClick

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

1

2

3

4

5

6

7

8

9

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视频教程栏目!

以上就是react的setSate的异步问题的分析的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

javascript输出语句有哪些

canvas波浪效果的实现代码

一起看看 鸿蒙 javascript gui 技术栈

c和javascript的区别是什么

javascript弱类型什么意思

javascript中调用函数的方法有哪些

深入浅析javascript中的快速排序

javascript怎么保留两位小数

javascript预编译做了啥

资源合并与压缩的优化方法介绍

更多相关阅读请进入《react.js》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...