a标签onclick不执行_这届面试官,不讲武德

20d3eedaea7972682aa6c77678f403c1.png

来源丨经授权转自公众号 魔术师卡颂

最近React源码群里有个同学去大厂面试被问到一道经常在各种面经中出现的问题:

229fc769b9d949cad43d033a64cd6b9c.png

据说标准答案是:React是异步更新,依据是:

触发如下点击事件后console.log打印的结果不是1

onClick() {
  this.setState({a: 1});
  console.log(this.state.a);
}

紧接着这题,面试官又会问:“那如何同步更新呢?”

据说标准答案是:把setState放到setTimeout中:

onClick() {
  setTimeout(() => {
    this.setState({a: 1});
    console.log(this.state.a);
  })
}

如果能回答到这,面试官会露出欣慰的笑:小伙子很懂React嘛。

可是,我们真的会用到这么hack的写法么?这个所谓“标准答案”又一定是对的么?

setState是同步还是异步的?

首先这个问法就很有问题。这个问法想表达的是:

在某个组件中调用this.setState会让该组件对应视图同步更新还是异步更新?

这里隐含的前提是:视图更新是以组件为粒度更新。

我们可以用一个公式描述React

UI = f(state)

视图(UI)可以表示为状态(state)通过某个函数(f)的映射。

其中:

  • UI是反映页面的DOM树

  • fReact的内部运行流程

  • state是状态的集合

从公式可以看出,每次调用this.setState,整个React应用会执行一遍更新流程,将状态映射为视图

只不过恰巧在映射过程中,这个组件的state改变,所以组件对应的视图会映射为新的视图

最终表现为:视图其他部分不变,该组件视图更新。

从这个角度看,这道面试题就完全没有意义了。

既然每次更新都是整个视图层面,而不是某个组件,那么更新是同步还是异步都无所谓了。

毕竟对组件的操作完全应该在各个生命周期函数(或者hooks)中进行。

从源码角度讲

那为什么被setTimeout包裹的this.setState可以在当前调用栈获取到更新后的state

其实这么问也是有问题的。

之所以会有这样的现象,是因为老版本React内部实现的缺陷。

在v17以后,开启Concurrent Mode,即使在setTimeout中调用this.setState,在当前调用栈获也无法获取更新后的state

简单讲一下,在老版React中,事件回调会被包裹在batchedUpdates函数中执行。

代码类似如下:

function batchedUpdates(fn) {
  let prevContext = context;
  context |= batchedContext;
  try {
    fn();
  } finally {
    context = prevContext;
  }
}

被包裹的事件回调fn通过全局变量context就能获取当前是否处于batchedContext的上下文环境。

如果处于该环境就执行一些批处理操作。

而是否用setTimeout包裹this.setState影响的,就是在执行this.setState时全局变量context是否包含batchedContext

在新版React中,batchedUpdates已经被lane优先级模型替代,不会再有batchedContext的限制。

可见,仅仅是React内部实现的缺陷,却被拿来当高深的面试题,只能说,这届面试官,不讲武德。

7beedf785748b99b46dacaf0280c1a37.gif

1、没想到,Git居然有3种“后悔药”! 2、深夜里,程序员最喜欢去的网站竟然是 ... 3、6 个例子教你重构 Python 代码 4、面试官:Redis 主从复制时网络开小差了怎么整? 915ec3aae26b6175168c2ee41ac8ce53.gif 55ce6e92da057be42a1fa9c2a72bbe3c.png

识别关注我们

了解更多精彩内容

44240a5bd079a0e39aa239a41c9d0319.gif

点分享

9fa575007406e89b41e7749a1ca783d4.gif

点点赞

3be985c454d0b8927b899a690f8e0de1.gif

点在看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用中的描述,您在使用mpu6050时遇到了FIFO溢出的问题。根据引用中的代码片段,当FIFO的数据量达到一定程度时,程序会检查溢出位,并执行相应的处理操作。如果检测到溢出,会调用mpu_reset_fifo()函数进行重置。 引用中也提到了类似的问题,他们通过增加头文件MPU6050_6Axis_MotionApps20.h中305行的最后一个数字来解决fifo overflow的问题。 对于您的问题,您可以尝试以下步骤来设置mpu6050的FIFO: 1. 确保在初始化代码中正确地开启了FIFO。 2. 检查FIFO的最大容量设置是否正确。这个值可以通过st.hw->max_fifo来获取。确保该值与实际硬件的配置相匹配。 3. 如果FIFO溢出导致问题,您可以尝试使用mpu_reset_fifo()函数进行重置。 另外,您还可以参考引用中提到的方法,根据您的具体情况适当调整头文件中的参数,例如增加最后一个数字,以解决fifo overflow的问题。 希望以上信息对您有所帮助。如果您还有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MPU6050不武德,FIFO溢出始终无法解决,提高或降低读取速度都不得行](https://blog.csdn.net/u013967094/article/details/114269196)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [mpu6050 报错fifo overflow解决办法](https://blog.csdn.net/qq_29573053/article/details/61922140)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [MPU6050 DMP调试出现FIFO溢出问题](https://blog.csdn.net/weixin_44907399/article/details/124932967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值