Vue 在更新 DOM 时是异步执行的。

只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。

异步更新DOM实例

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue nextTick</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head> <body>
<div id="app">
<example></example>
</div> <script>
// 注册 example 组件
Vue.component('example', {
template: '<span ref="box" @click="updateMessage">{{ message }}</span>',
data () {
return {
message: '未更新'
}
},
methods: {
updateMessage () {
this.message = '已更新' console.log('nextTick方法前--->', this.$refs.box.textContent) // => '未更新' this.$nextTick(function () {
console.log('nextTick方法内--->', this.$refs.box.textContent) // => '已更新'
}) console.log('nextTick方法后--->', this.$refs.box.textContent) // => '未更新'
}
}
}) // 创建根实例
new Vue({
el: '#app'
})
</script>
</body> </html>

点击 span , 执行 updateMessage方法,输出结果如下:

nextTick方法前---> 未更新
nextTick方法后---> 未更新
nextTick方法内---> 已更新

可见,Vue 数据发生变化之后,视图不会立即变化。该更新过程是异步的。

所以,如果要获取更新后的视图,可以使用 $nextTick(callback)。这里的回调函数(callback)将在数据更新完成,视图更新完毕之后被调用。

$nextTick 结合 async/await 语法

$nextTick() 返回一个 Promise 对象,所以可以使用新的 ES2016 async/await 语法完成相同的事情:

methods: {
async updateMessage () {
this.message = '已更新'
console.log('nextTick方法前--->', this.$refs.box.textContent) // => '未更新' await this.$nextTick(function () {
console.log('nextTick方法内--->', this.$refs.box.textContent) // => '已更新'
}) console.log('nextTick方法后--->', this.$refs.box.textContent) // => '已更新'
}
}

执行点击事件,打印结果:

nextTick方法前---> 未更新
nextTick方法内---> 已更新
nextTick方法后---> 已更新

$nextTick 常用场景

在Vue生命周期钩子函数created()中进行的DOM操作。

由于created()钩子函数中还未对DOM进行任何渲染,所以无法直接操作,需要通过$nextTick()回调来完成。

created() {
console.log(this.$refs.box.textContent); // TypeError: Cannot read property 'textContent' of undefined
this.$nextTick(() => {
console.log(this.$refs.box.textContent); // 未更新
})
},

Vue 中 $nextTick() 的应用的更多相关文章

  1. vue中nextTick

    vue中nextTick可以拿到更新后的DOM元素 如果在mounted下不能准确拿到DOM元素,可以使用nextTick 在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue ...

  2. vue的nextTick的实现

    vue的nextTick是用浏览器支持的方法模拟nodejs的process.nextTick 老版本的vue用如下方法来模拟 Promise.thenMutationObserver(Mutatio ...

  3. Vue中nextTick()解析

    最近,在开发的时候遇到一个问题,让我对vue中nextTick()的用法加深了了解- 下面是在组件中引用的一个拖拽的组件: <vue-draggable-resizable class=&quo ...

  4. Vue的nextTick是什么?

    公司做之前项目的时候,遇到了一些比较困惑的问题,后来研究明白了nextTick的用法. 我们先看两种情况: 第一种: export default { data () { return { msg: ...

  5. 【vue】nextTick源码解析

    1.整体入手 阅读代码和画画是一样的,忌讳一开始就从细节下手(比如一行一行读),我们先将细节代码折叠起来,整体观察nextTick源码的几大块. 折叠后代码如下图 整体观察代码结构 上图中,可以看到: ...

  6. Vue中$nextTick的理解

    Vue中$nextTick的理解 Vue中$nextTick方法将回调延迟到下次DOM更新循环之后执行,也就是在下次DOM更新循环结束之后执行延迟回调,在修改数据之后立即使用这个方法,能够获取更新后的 ...

  7. 基于源码分析Vue的nextTick

    摘要:本文通过结合官方文档.源码和其他文章整理后,对Vue的nextTick做深入解析.理解本文最好有浏览器事件循环的基础,建议先阅读上文<事件循环Event loop到底是什么>. 一. ...

  8. vue之nextTick全面解析

    vue的第一篇文章,介绍一下简单的nextTick方法的实现原理 简介 vue是非常流行的框架,他结合了angular和react的优点,从而形成了一个轻量级的易上手的具有双向数据绑定特性的mvvm框 ...

  9. vue中nextTick和$nextTick的差别

    <ul id="demo">     <li v-for="item in list">{{item}}</div> < ...

  10. 基于iscroll的better-scroll在vue中的使用

    什么是 better-scroll better-scroll 是一个移动端滚动的解决方案,它是基于 iscroll 的重写,它和 iscroll 的主要区别在这里.better-scroll 也很强 ...

随机推荐

  1. 【oracle】ORA-12638

    背景:换电脑时将旧电脑的ORACLE的登陆信息转到新电脑.其中有三个文件:listener.ora   sqlnet.ora  tnsnames.ora 解决办法:删了sqlnet.ora 原因:

  2. csv与openpyxl函数

    csv 与openpyxl函数 csv函数 常用的存储数据的方式有两种--存储成csv格式文件.存储成Excel文件(不是复制黏贴的那种) 前面,我有讲到json是特殊的字符串.其实,csv也是一种字 ...

  3. SWA2G422&485JK2G基础篇: 硬件使用说明

    开发板板载介绍(当前使用的测试板,以后期最终版为准) 一,实物图 硬件说明 一,开发板主控芯片说明: 1. 单片机: STM32F103RET6 2. GPRS模块: Air202 二,开发板外设说明 ...

  4. 洛谷 P2580 【于是他错误的点名开始了】题解

    XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). 题目背景 ...

  5. Android apps for “armeabi-v7a” and “x86” architecture: SoC vs. Processor vs. ABI

    INSTRUCTION SET: Processors are made of semiconductor dies, usually electronic-grade mono-crystallin ...

  6. 原生js给同一对象绑定多个事件

    事件监听 var son = document.querySelector(".son"); son.addEventListener('click', once1); funct ...

  7. 2013(1)需求工程, 需求开发, 需求分析, 面向对象需求分析, UML,需求建模

    案例一 某软件公司拟为物流企业开发一套库存管理系统,该系统的部分需求陈述如下: (1) 库存管理系统主要包括货物入库管理.货物出库管理.仓库管理.统计报表和系统管理等功能. (2) 库存管理系统的用户 ...

  8. 特征值、特征向量与PCA算法

    一.复习几个矩阵的基本知识 1. 向量 1)既有大小又有方向的量成为向量,物理学中也被称为矢量,向量的坐标表示a=(2,3),意为a=2*i + 3*j,其中i,j分别是x,y轴的单位向量. 2)向量 ...

  9. 2018-2019-2 20165313 《网络对抗技术》 Exp 8 Web基础

    一.实践要求: (1).Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. (2).Web前端javascip ...

  10. [技术博客]阿里云签名机制字符串的C语言实现

    [技术博客]阿里云签名机制字符串的C语言实现 问题描述见:阿里云签名机制 话不多说,上字符串函数转化函数代码 bool AlicloudRequest::sendV2Request() { if( q ...