为什么在nexttick之后没有vue更新数据?

时间:2017-12-15 21:24:18

标签: vue.js vuejs2

我正在尝试了解vuejs nexttick方法,我不确定为什么在本例中的nexttick之后消息没有被更新..

new Vue({
  el: '#app',
  data: {
    message: 'one'
  },
  created() {
    this.message = 'two';
    this.$nextTick(() => {
      this.message = 'three';
    });
    this.message = 'four'
  }
})

如果我使用

回应它
<div id="app">
  <p>{{ message }}</p>
</div>

我只看到three。我理解为什么一个和两个是showng因为nexttick()快速更改数据,但为什么four没有显示呢?

2 个答案:

答案 0 :(得分:2)

当你致电$nextTick()时,它会安排内部功能在下一个时间点运行。但是,调用 $nextTick()的函数将在调用传递到nextTick()的函数之前完成。

以下是$nextTick() https://vuejs.org/v2/api/#vm-nextTick

的官方文件
  

将回调推迟到下一个DOM更新周期后执行。使用   在您更改了一些数据以等待DOM之后立即执行此操作   更新。这与全局V​​ue.nextTick相同,除了   callback的这个上下文自动绑定到实例调用   这种方法。

this.message = 'three';最后被执行,这就是为什么你总是看到“三个”

您的代码实际按以下顺序执行:

this.message = 'two';
this.message = 'four'
//then in the next tick of the event loop / DOM update which is likely instantaneous
this.message = 'three';

您文件中代码的顺序并不能确定javascript引擎实际执行它的顺序。

答案 1 :(得分:0)

根据您有关的问题

  

但是为什么不显示四个呢?

关于宏任务微任务问题。当您使用nextTick时,也许您的浏览器会提供支持,所以Vue将使用它来执行您的功能。

由于承诺会被归类为微任务,因此nextTick函数实际上是在UI渲染之前完成的。

setTimeout被分类为宏任务,您的函数将在UI Render之后的下一个事件循环中完成,您将在短时间内看到“四个”!

DOM更新不等于UI渲染