vue之理解异步更新 --- nextTick

  默认情况下,vue中DOM的更新是异步执行的,理解这一点非常重要。

  当侦测到数据变化时,Vue会打开一个队列,然后把在同一个事件循环(event loop)当中观察到的数据变化的watcher推送进入这个队列,加入一个watcher在一个事件循环中被触发了多次,它只会被推送到队列中一次, 然后在进入下一次的事件循环时,Vue会清空队列并进行必要的DOM更新,。在内部,Vue 会使用 MutationObserver 来实现队列的异步处理,如果不支持则会回退到 setTimeout(fn, 0)。   

举例来说

  当你设置 vm.someDate = ‘ new value ‘ 时, DOM并不会马上更新,而是在异步队列中被清楚, 也就是在下一个事件循环中开始执行更新, 如果你希望通过更新的DOM状态去做某些事情,那么就必须留意这个细节, 尽管vue.js鼓励开发者用“数据驱动”的方式想问题,避免直接操作DOM,但是有时候你可能是想要使用某个熟悉的jQuery插件这种情况该怎么办呢? 

  你可以在数据改变之后,理解调用 Vue.nextTick(callback),并把你要做的事情放在回调函数中。 当Vue.nextTick的回调函数执行时,DOM就是已经更新后的状态了。 

  

实例:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>vue</title>
  <script src="https://cdn.bootcss.com/vue/2.3.3/vue.min.js"></script>
</head>
<body>
<div id="example">{{msg}}</div>

  <script>
    var vm = new Vue({
      el: "#example",
      data: {
        msg: "hello"
      }
    });
    vm.msg = "zzw"
    alert(vm.$el.textContent === "zzw");
    Vue.nextTick(function () {
      alert(vm.$el.textContent === "zzw");
    });
  </script>
</body>
</html>

通过这个例子就可以很好的理解了。

除此之外,也有一个实例方法 vm.$nextTick() ,这个方法和全局的Vue.nextTick 的功能一样,但是更方便在组件内部使用,因为它不需要全局的Vue变量, 另外它的回调函数中的 this上下文 会自动绑定到它的Vue实例中。

Vue.component(‘example‘, {
  template: ‘<span>{{msg}}</span>‘,
  data: function () {
    return {
      msg: ‘not updated‘
    }
  },
  methods: {
    updateMessage: function () {
      this.msg = ‘updated‘
      console.log(this.$el.textContent) // => ‘not updated‘
      this.$nextTick(function () {
        console.log(this.$el.textContent) // => ‘updated‘
      })
    }
  }
})

参考文章: 细节与最佳实践

时间: 2024-11-05 21:42:38

vue之理解异步更新 --- nextTick的相关文章

Android 异步更新UI-线程池-Future-Handler实例分析

前言: 我们在开发Android过程中,在处理耗时任务和UI交互的过程中,都会将耗时任务放到子线程处理并刷新. 下面我提出的两个问题,相信大多数开发者都会碰到: 1. 数据经常需要读取更新,并且比较耗时,需要分步刷新UI. 2. UI界面切换后,如何停止掉子线程里面正在读取的数据而不会将旧数据刷新到新UI界面上. 目前网上大部分教程主要只是简单的Handler.postDelayed(), Thread + Handler, Async等方式, 只适用于简单的一次性刷新. 或许有人会说我可以采用

从Vue.js源码看异步更新DOM策略及nextTick

写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/answershuto/learnVue.在学习过程中,为Vue加上了中文的注释https://github.com/answershuto/learnVue/tree/master/vue-src,希望可以对其他想学习Vue源码的小伙伴有所帮助.可能会有理解存在偏差的地方,欢迎提issue指出,共同学

Vue系列---理解Vue.nextTick使用及源码分析(五)

_ 阅读目录 一. 什么是Vue.nextTick()? 二. Vue.nextTick()方法的应用场景有哪些? 2.1 更改数据后,进行节点DOM操作. 2.2 在created生命周期中进行DOM操作. 三. Vue.nextTick的调用方式如下: 四:vm.$nextTick 与 setTimeout 的区别是什么? 五:理解 MutationObserver 六:nextTick源码分析 回到顶部 一. 什么是Vue.nextTick()? 官方文档解释为:在下次DOM更新循环结束之

vue使用ECharts时的异步更新与数据加载

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px "Helvetica Neue"; color: #404040 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "Helvetica Neue"; color: #737373 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco

从异步更新进度想起的事儿——IProgress

今天,在群里向大家请教了这样一个问题:"两个对象(类.窗体或什么)之间,要完成比较频繁的报告进度更新都有哪些好的方式",Somebody 跳出来给出了个"IProgress",没了解过,后面围绕着它讨论学习了下. 简单来说,IProgress 是类库给出的一种解决问题的方式而非具体实现,IProgress 包括一个需要实现的 Report 方法.使用时由调用"任务"的"创建者"创建对接口的实现,也就是具体实现 Report 的

Fiddler用AutoResponder实现app升级异步更新

先说一下我自己理解的异步更新:用app异步升级举例,app是否升级的检查是在启动app时访问服务器的,把app本地的最新版本号与服务器端的最新版本号做对比,假如不一致,则提示升级.但本次已经打开使用app了,之后我在后台修改了最新版本的版本号,本次使用是不会受到影响的,只有当下次再次打开时又会对比本地与服务器的版本号,这时发现服务器的版本号比本地高,之后就发送请求,本地也会有弹窗提示升级.异步体现在我修改服务器是在第一次打开app之后,可是提示升级确是在我第二次打开app时候. 在实际测试中,我

Winform实现多线程异步更新UI(进度及状体信息)

引言 在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要一定的时间,然在这个时间段里面,界面ui得不到更新,导致在用户看来界面处于假死的状态,造成了不好的用户体验.所以在大量数据操作的应用上,需要使用多线程来处理这种情况.在c#中使用多线程很方便只需要使用System.Threading.Thread的一个实例的Start方法就行了,但是如何实现多线程之间的交互就不是那么简单.本文实现了用子线程去处理数据,并实时更新主线程的ui状态了.下面就开始一步步的去实现异步线程更新

WPF中异步更新UI元素

XAML 界面很简单,只有一个按钮和一个lable元素,要实现点击button时,lable的内容从0开始自动递增. <Grid> <Label Name="lable_plus" Content="0"/> <Button Content="Button" Click="button_Click" Height="23" Name="button" Wid

使用Ajax选取ListBox的值异步更新视图,并作为表单值提交

一.控制器返回一个ViewBag MultiSelecList值. public ActionResult Create() { ViewBag.ReviewIndexItems = new MultiSelectList(db.ReviewIndexItems.OrderBy(item => item.ReviewIndexItemNumber).ToList(), "ReviewIndexItemID","ReviewIndexItemName"); re