初识vue 2.0(12):使用$nextTick获取更新后的DOM

Vue 异步执行 DOM 更新。

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

如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作上非常重要。

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

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

例如,当你设置 vm.msg = ‘Hello world‘ ,该组件不会立即重新渲染。当刷新队列时,组件会在事件循环队列清空时的下一个"tick"更新。

多数情况我们不需要关心这个过程,但是如果你想在 DOM 状态更新后做点什么,这就可能会有些棘手。

虽然 Vue.js 通常鼓励开发人员沿着"数据驱动"的方式思考,避免直接接触 DOM,但是有时我们确实要这么做。

为了在数据变化之后等待 Vue 完成更新 DOM ,可以在数据变化之后立即使用 Vue.nextTick(callback) 。

这样回调函数在 DOM 更新完成后就会调用。

使用场景:

1. 在Vue生命周期的 created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中。

2. 在数据变化后要执行的某个操作,例如数据变化后立刻操作DOM。

例子:

创建Hello.vue组件,注意标注中的执行顺序

<template>
    <div class="hello">
        <span @click="update" ref="msg">{{ msg }}</span>
        <router-link to="Game">Game</router-link>
    </div>
</template>
<script>
export default {
    name: ‘Hello‘,
    data () {
        return {
            msg:"Hello"//原始数据
        }
    },
    methods: {
        update(e){
            this.msg = ‘Hello world‘;//更改数据

            console.log(‘Start:‘ + e.target.innerText);//1 Hello

            this.$nextTick(function(){
                console.log(‘nextTick:‘ + e.target.innerText);//5 Hello world
            });

            setTimeout(function(){
                console.log(‘setTimeout:‘ + e.target.innerText);//6 Hello world
            },0);  

            console.log(‘End:‘ + this.$refs.msg.innerText);//2 Hello
        }
    },
    beforeUpdate(){
        console.log(‘beforeUpdate:‘ + this.$refs.msg.innerText);//3 Hello
    },
    updated(){
        console.log(‘updated:‘ + this.$refs.msg.innerText);//4 Hello world
    },
    created(){
        //直接输出会报错
        this.$nextTick(function(){
            console.log(‘created:‘ + this.$refs.msg.innerText);//2 Hello
        });
    },
    mounted(){
        console.log(‘mounted:‘ + this.$refs.msg.innerText);//1 Hello
    },
}
</script>

<style>
.hello{
  background-color:#E1FFFF;
}
</style>

例子中,仿佛setTimeout(fn, 0)和Vue.nextTick()是一样的效果?

官网解释:

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

例子中,仿佛可以使用mounted或者updated代替Vue.nextTick()?

官网解释:

使用 mounted 并不能保证钩子函数中的 this.$el 在 document 中。为此还应该引入 Vue.nextTick/vm.$nextTick。例如:

mounted() {
  this.$nextTick(function () {
    // 代码保证 this.$el 在 document 中
  })
}

参考:

https://cn.vuejs.org/v2/api/#Vue-nextTick

https://cn.vuejs.org/v2/guide/migration.html#ready-%E6%9B%BF%E6%8D%A2

https://cn.vuejs.org/v2/guide/reactivity.html#%E5%BC%82%E6%AD%A5%E6%9B%B4%E6%96%B0%E9%98%9F%E5%88%97

原文地址:https://www.cnblogs.com/phptree/p/10103974.html

时间: 2024-10-09 21:40:26

初识vue 2.0(12):使用$nextTick获取更新后的DOM的相关文章

初识vue 2.0(4):vuex组件通信

0,本来想只用vue就可以做项目了,后来发现不行:一个网页被切分成若干个组件,组件之间是需要数据传递的,因此引入了vuex这个集中式存储.管理的状态管理模式. 1,安装vuex: npm install --save vuex 在main.js中引入: import Vuex from 'vuex' Vue.use(Vuex) 2,创建数据源文件vuex/store.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) co

初识vue 2.0(3):Ajax请求

0,模拟ajax请求,需要构建web程序,使用express 方便快捷. 1,安装express 构建web server: npm install -g express npm install -g express-generator 2,创建 express 项目: express myserver cd myserver npm install 3,启动项目,一般情况下可以使用: npm start 但开发环境需要监控代码变动并自动重启进程,因此需要安装 supervisor. npm i

vue 2.0+ 怎么写本地接口获取数据

在vue-cli脚手架项目中,找到build ---- webpack.dev.conf.js 文件,具体位置如下图: 找到文件后添加下面的内容,写在头部: //这是 webpack.dev.conf.js 文件里的 'use strict' /*新版的vue-cli代替原来的dev-server.js文件,现在在这里可以简单配置node请求,获取一些本地数据 */ const express = require("express");//需要先npm install --save e

初识vue 2.0(13):子组件使用watch监听父组件变化

子组件使用created或者mounted通常只能在组件初始化的时候,获取父组件传过来的props数据. 父组件props数据发生变化,子组件默认无法感知,因此需要手动实现子组件监听父组件变化的功能. 一般的值类型数据,可以直接使用watch监听: watch: { msg(newVal, oldVal){//对引用类型的值无效 console.info('value changed ', newVal) } } 引用类型,普通watch方法,无法监听到引用类型内部的变化. 解决此问题,可以在父

初识vue 2.0(2):路由与组件

1,在上一篇的创建工程中,使用的的模版 webpack-simple 只是创建了一个简单的demo,并没有组件和路由功能,此次采用了webpack模版,自动生成组件和路由.^_^ 在模版初始化时,因为ESLint语法检查过于严格,可以暂时不要开启. vue init webpack myapp ? Install vue-router? Yes ? Use ESLint to lint your code? No ? Setup unit tests with Karma + Mocha? Ye

Vue 2.0开发企业级移动端音乐WebAPP

第1章 课程内容介绍包括课程概述.课程安排.学习前提.讲授方式等方面的介绍,最后演示了整个音乐App的功能,让同学们对课程项目有一个直观的了解.1-1 导学1-2 课前必读(源码获取方式) 第2章 项目准备工作包括项目需求分析.脚手架初始化代码.项目目录介绍及图标字体.公共样式等资源的准备 .2-1 需求分析2-2 Vue-cli脚手架安装2-3 项目目录介绍及图标字体.公共样式等资源准备 第3章 页面骨架开发包括页面入口.header 组件的编写.路由配置及顶导 tab 组件开发.3-1 页面

vue 2.0 开发实践总结之疑难篇

续上一篇文章:http://www.cnblogs.com/beidan/p/6129891.html ,如果没有看过的可以移步看一下. 本篇文章目录如下: 1.  vue 组件的说明和使用 2.  vuex在实际开发中的使用 3.  开发实践总结 1.  vue 组件的说明和使用 一个组件实质上是一个拥有预定义选项的一个 Vue 实例 在header组件内部允许外部使用,需要导出属性,有2种导出方法 1.  默认导出(不用命名) 1 export default { 2 data () { 3

Vue.2.0.5-组件

什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. 使用组件 注册 之前说过,我们可以通过以下方式创建一个 Vue 实例: new Vue({ el: '#some-element', // 选项 }) 要注册一个全局组件,你可以使用 Vue.component(tagName

新手入门指导:Vue 2.0 的建议学习顺序

起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script>,把教程里的例子模仿一遍,理解用法.不推荐上来就直接用 vue-cli 构建项目,尤其是如果没有 Node/Webpack 基础. 3. 照着官网上的示例,自己想一些类似的例子,模仿着实现来练手,加深理解. 4. 阅读官方教程进阶篇的前半部分,到『自定义指令 (Custom Directive) 』为止.着