为啥当两个响应式数据突变超级关闭时,Vue 只会更新一次?

Posted

技术标签:

【中文标题】为啥当两个响应式数据突变超级关闭时,Vue 只会更新一次?【英文标题】:Why Vue will update only once when two reactive data mutation super close?为什么当两个响应式数据突变超级关闭时,Vue 只会更新一次? 【发布时间】:2021-03-10 03:07:32 【问题描述】:

请看这个最小的例子

export default 
  data() 
    return 
      name: "Amy",
      age: 18,
    ;
  ,
  computed: 
    combinedDataForWatching() 
      return 
        name: this.name,
        age: this.age,
      ;
    ,
  ,
  watch: 
    combinedDataForWatching() 
      console.log("Triggered!");
    ,
  ,
  mounted() 
    setTimeout(() => 
      this.name = "Bob";
      this.age = 20;
    , 1000);
  ,
;

控制台只会记录一次"Triggered!",为什么会这样?

而 Vue 是如何确定这批更新的?

【问题讨论】:

【参考方案1】:

来自Vue guide on reactivity:

如果您还没有注意到,Vue 会异步执行 DOM 更新。每当观察到数据更改时,它将打开一个队列并缓冲同一事件循环中发生的所有数据更改。如果同一个 watcher 被多次触发,它只会被推入队列一次。这种缓冲的重复数据删除对于避免不必要的计算和 DOM 操作很重要。然后,在下一个事件循环“tick”中,Vue 刷新队列并执行实际的(已经去重复的)工作。

因此,这两个监视触发器更新都发生在同一个更新周期中,并且被反应系统“重复数据删除”到一个调用中。

【讨论】:

好的,谢谢您的信息。知道如何解决吗? @ValentinHeinitz - 它没有坏,这里没有什么可修复的。

以上是关于为啥当两个响应式数据突变超级关闭时,Vue 只会更新一次?的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Vue数据响应式

为啥在 vue 3 watch 上不调用对象突变?

为啥我的 Vue 应用程序中的 v-model 输入会在更改时触发突变错误?

Vue 中的方法是响应式的吗?

vue的响应式原理

为啥这个 Vue 计算属性不是响应式的?