官方文档表示:为了在数据变化之后等待Vue完成更新DOM,可以在数据变化之后立即执行Vue.$nextTick(callback),这样回调函数就可以在数据变化之后立即执行。

这段话的意思是:

例如:存在

<div id="test">{{ message }}</div>  // 假如此时message的值是 hi

当我们对data(){return{}}中的值进行赋值修改时(例:this.message = 'hello'),虽然数据变化了,但是其实DOM上的内容并未改变,所以如果此时通过原生js获取这个div的innerHTML时,它的值仍是'hi',而不是赋值修改后的'hello'。

this.message = 'hello';
console.log(this.message); // hello, 数据发生了变化
alert(document.getElementById('test').innerHTML); // hi, DOM还未发生变化

而如果我们在修改了数据之后就想要马上对变化更新后的DOM进行操作,就需要在this.$nextTick(callback)中调用:

this.message = 'hello';
console.log(this.message); // hello, 数据发生了变化
this.$nextTick(() => {
alert(document.getElementById('test').innerHTML); // hello, DOM已发生变化
})

这个例子可能看起来没什么实际用途,另一个例子:

当我们需要通过某个值(假设: show_login_register)来对显示的内容(是显示登录框还是注册框)进行判断(v-if,v-else),并需要获取变化后的内容的clientHeight来做定位设置,此时,如果我们在show_login_register的值被赋值改变后就直接获取内容的clientHeight,此时,内容还是原来的登录框(假设是想要从登录框变成注册框),如果我们想要获取到变化后的内容(注册框的clientHeight),就需要在this.$nextTick的回调函数中做操作。

实现原理:

Vue其实是异步执行DOM更新的。

1、只要观察到数据变化,Vue将开启一个队列,并对同一事件循环中发生的所有数据变化做缓冲。

2、如果同一个watcher被多次触发(即一个变量在一次事件循环中被赋值变化了多次),则只会推入队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和DOM操作非常重要。

3、然后,在下一个的事件循环"tick"中,Vue刷新队列并执行实际(已去重的)工作(即更新DOM)。

Vue在内部尝试对异步队列使用原生的Promise.thenMutationObserver(这个是html 5新加的一个功能,其功能是监听dom节点的变动,在所有dom变动完成后,执行回调函数),如果执行环境不支持,会采用setTimeout(fn,0)代替。

关于Vue的nextTick的一点小理解的更多相关文章

  1. net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解

    asp.net core 内置DI容器的一点小理解   DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...

  2. Layui的一点小理解(上)

    首先声明这是个人的一点理解,如有不对之处请指正,以下的例子有在官网上看到的,有的是自己写的.还是老规矩最后会附上官网的,如有不明白之处,请查看文档或留言. 既然说Layui,当然要简单的介绍以下什么是 ...

  3. params数据来源和参数传递的一点小理解

    今天是星期一,上次说的两个需求,解决了一个.在原来的页面增加了一个可以勾选的单选框用于完成,勾选对应的条件来渲染对应的页面,使用了简单的单选框radio_button来实现单选的提交,使用条件判断语句 ...

  4. asp.net core 内置DI容器的一点小理解

    DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IOC). 具体体现为Micorosoft.Extensio ...

  5. 关于@Mapper和@Repository的一点小理解

    参考博客:https://blog.csdn.net/lalioCAT/article/details/51803461 如果在接口上@Mapper,然后再在 xml中的namespace指向mapp ...

  6. Redis分布式锁的一点小理解

    1.在分布式系统中,我们使用锁机制只能保证同一个JVM中一次只有一个线程访问,但是在分布式的系统中锁就不起作用了,这时候就要用到分布式锁(有多种,这里指 redis) 2.在 redis当中可以使用命 ...

  7. 基于源码分析Vue的nextTick

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

  8. Vue中$nextTick的理解

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

  9. 关于win8开发的一点小总结

    我今天做画面的时候,发现了一点小问题. 我在xmal文件里面加了一个CheckBox控件,设置IsChecked属性为True,并添加了Checked事件.Checked事件里面有对另外一个TextB ...

随机推荐

  1. Redis散列操作

    Redis的散列可以将多个键值对存储在一个Redis键里面.可以把这种数据聚集看作是数据库中的行或者文档数据库中的文档. (添加和删除键值对) HMGET : HMGET key-name key [ ...

  2. echarts展示箱型图&正态分布曲线

    效果图: 直接上代码吧: <!DOCTYPE HTML> <html> <head> <style type="text/css"> ...

  3. Linux应用调试-strace命令

    1.strace简介 strace常用来跟踪进程执行时的系统调用和所接收的信号.通过strace可以知道应用程序打开了哪些文件,以及读写了什么内容,包括消耗的时间以及返回值等 2.安装strace命令 ...

  4. 乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

  5. leetcode字符串系列

    3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...

  6. ActiveMQ demo

    Maven 配置文件 <dependency> <groupId>org.apache.activemq</groupId> <artifactId>a ...

  7. BZOJ3884(SummerTrainingDay04-C 欧拉定理)

    上帝与集合的正确用法 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天,  上帝创造了一个世界的基本元素,称做“元”. 第二天,  上帝创造了一个新的元素,称作“α”.“α”被定义为“元 ...

  8. numpy练习题

    1. 导入numpy库并简写为 np import numpy as np 2. 打印numpy的版本和配置说明 print(np.__version__) print(np.show_config( ...

  9. 关于python操作带有中文文件名报错的解决办法

    python代码的编码格式       #coding:utf-8 在操作文件时,如果文件名带有中文,则需要将文件路径以Unicode的编码格式进行操作 具体的方式如下 path = "你的 ...

  10. Wampserver配置与本地建站

    ☆根目录修改问题 /.修改运行根目录 1.修改apache配置,将服务请求定位到新目录下 →左击wampserver,点击Apache打开httpd.conf文件,Ctrl+f搜索documentro ...