老师下面这段的逻辑不明白,老师能不能画一个数据流的图给讲解一下呢?

老师下面这段的逻辑不明白,老师能不能画一个数据流的图给讲解一下呢?

          onClick={()=>{
            this.setState({ count: this.state.count + 1 }, () => { console.log("s",this.state.count); });
             this.setState({ count: this.state.count + 1 }, () => { console.log("d",this.state.count); });
            // Output:
            // w 0
            // s 1
            // d 1
            // w 1
            // s 2
            // d 2
           
            console.log("w",this.state.count);
          }}

老师上面那段就是外层的log输出语句和两个个setState是异步的,三个语句同时出发,外层的输出语句执行完、新的state设置完之后再执行callback回调函数,这样理解对吧

https://img1.sycdn.imooc.com//climg/62ef3c91090ca72113130890.jpg



下面这段的逻辑不明白,老师能不能像上面一个画一个数据流的图给讲解一下呢?

          onClick={()=>{
            setState 的第一个参数可以是对象,也可以是函数,函数的第一、二个参数分别是上一个生命周期的的state和props
            this.setState((preState,preProps)=> {return{ count: preState.count + 1 }}, () => { console.log("s",this.state.count); });
            this.setState((preState, preProps) => { return { count: preState.count + 1 }}, () => { console.log("d",this.state.count); });
            // Output:
            // w 0
            // s 2
            // d 2
            // w 2
            // s 4
            // d 4



            // 这一句比上面setState的回调函数里面的内容先执行,因为这一句跟setState同时执行(setState本身异步操作),setState处理完state之后回调函数才执行
            console.log("w",this.state.count);
          }}

上一个state的count是0,外层的log语句输出0,两个setState也是同时执行,为什么最后回调函数出来的都是2?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕慕子 2022-08-07 13:20:54

同学你好,问题解答如下:

1、下图所示理解是对的

https://img1.sycdn.imooc.com//climg/62ef4aac09667f9908090083.jpg

2、第二段粘贴的代码数据流与同学第一段粘贴的代码画的数据流类似。

由于第二段代码中,setState方法中第一个参数传入的是一个函数,该函数中的第一个参数可以获取到上一个生命周期的state,所以是在上一次state状态下的count值基础上进行加一操作的,而两次的setState都是异步的,最终页面显示的是两次处理后的结果,所以点击一次后结果都是2

祝学习愉快~

  • 提问者 WYW265672 #1

    所以是在上一次state状态下的count值基础上进行加一操作的=====上一次count是0,+1不应该是1吗


    而两次的setState都是异步的,最终页面显示的是两次处理后的结果,所以点击一次后结果都是2 ==========第一段代码里两次setState也都是异步的啊,为什么只显示一次处理后的结果?两段代码的区别还是不明白

    2022-08-07 15:20:33
  • 好帮手慕慕子 回复 提问者 WYW265672 #2

    问题解答如下:

    1、因为this.setState((preState,preProps)=> {return{ count: preState.count + 1 }}, () => { console.log("s",this.state.count); }); 这种写法,第一个函数传入的回调函数中的第一个参数获取的是上一次的state状态值。

    也就是说初始count值为0,执行一次setState方法后,count加1后值为1,之后再执行一次setState方法,获取上一次state状态值,也就是说在count值为1的基础上再执行加一,操作后count值为2。由于是异步的,最后才执行后面的回调输出结果2

    2、两者的区别就是:

    (1)第一种写法,回调函数仅仅可以获取到当前修改后的state,再次执行setState方法获取到的state值依然为挂载后初始state值

    (2)第二种写法,setState接受函数作为参数,使用的参数就是上一次的state,实现在不同的setState方法中对初始state的不断累加。

    祝学习愉快~

    2022-08-07 15:35:30
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师