Vue 响应式原理 3-3

概念

结论:
Vue 在更新 DOM 时是异步执行的

流程:
1.只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更
2.如果同一个 watcher 被多次触发,只会被推入到队列中一次。
性能优化,这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的
3.在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。

异步事件更新2

(↑ 自己理解的数据更新意思)

Vue 在内部对异步队列尝试使用原生的 Promise.then、MutationObserver 和 setImmediate,
如果执行环境不支持,则会采用 setTimeout(fn, 0) 代替。

异步队列操作的语法

MutationObserver
setImmediate


语法解释
在工作中意义何在? 【获取更新后的 DOM 状态】

多数情况我们不需要关心这个过程,但是如果你想基于更新后的 DOM 状态来做点什么,这就可能会有些棘手。
虽然 Vue.js 通常鼓励开发人员使用“数据驱动”的方式思考,避免直接接触 DOM,但是有时我们必须要这么做。

通过Vue全局方法和实例方法,我们可以获取到更新后的时间节点
入口函数中,可以使用全局方法:Vue.nextTick(fn)
单页面组件中,可以使用实例方法:vm.$nextTick()

官方例:
全局方法

<div id="example">{{message}}</div>

var vm = new Vue({
  el: '#example',
  data: {
    message: '123'
  }
})
vm.message = 'new message' // 更改数据
vm.$el.textContent === 'new message' // false
Vue.nextTick(function () {
  vm.$el.textContent === 'new message' // true
})

实例方法

<div id="example">{{message}}</div>

Vue.component('example', {
  template: '<span>{{ message }}</span>',
  data: function () {
    return {
      message: '未更新'
    }
  },
  methods: {
    updateMessage: function () {
      this.message = '已更新'
      console.log(this.$el.textContent) // => '未更新'
      this.$nextTick(function () {
        console.log(this.$el.textContent) // => '已更新'
      })
    }
  }
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 现在是时候深入一下了!Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的 JavaScrip...
    youins阅读 715评论 0 3
  • 前言 Vue.js 的核心包括一套“响应式系统”。 “响应式”,是指当数据改变后,Vue 会通知到使用该数据的代码...
    NARUTO_86阅读 37,629评论 8 86
  • 如何追踪变化? 把一个js对象传递给Vue实例的data选项,Vue将遍历此对象的所有属性,并通过 Object...
    hello_water阅读 1,123评论 0 4
  •   Vue很好用的一点是响应式系统(reactivity system)。模型层(model)只是普通JS对象,修...
    小小的开发人员阅读 2,535评论 0 12
  • 前言 Vue.js 的核心包括一套“响应式系统”。 “响应式”,是指当数据改变后,Vue 会通知到使用该数据的代码...
    world_7735阅读 957评论 0 2