我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue中this.$nextTick()的具体使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue中this.$nextTick()的具体使用

1、官网说法

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM

核心点有2个:DOM 更新获取更新后的 DOM

DOM 更新,可以理解为:Vue 的DOM更新机制,那 Vue 的DOM更新机制是什么?

2、DOM 更新

首先,我们要知道:Vue实现响应式并不是数据发生变化之后DOM立即变化,而是异步执行DOM更新的。

通过代码我们验证下:不是数据发生变化之后DOM立即变化

<template>
  <div class="test">
    <div>
      <button @click="test" ref="btn">{{ msg }}</button>
    </div>
  </div>
</template>
<script>
export default {
  data () {
    return {
      msg: '按钮'
    }
  },
  methods: {
    test () {
      this.msg = '信息改变了。。。。'
      console.log('打印结果:' + this.$refs.btn.innerText) // 打印结果:按钮
    }
  }
}
</script>

此时log结果是:打印结果:‘按钮‘。而不是后来的 ‘信息改变了。。。。’
原因:Vue的响应式是异步执行DOM更新

异步执行DOM更新

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

在这里插入图片描述

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
主线程不断执行任务获取任务执行任务……的过程叫做事件循环

简单的理解
vue在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成以后,再进行视图更新.

为什么不同步进行DOM更新呢?
因为如果同步进行DOM更新,则每次对响应式数据进行修改就都会触发setter -> 通知watcher -> 触发re-render -> 生成new vnode(vdom) -> patch(更新真实DOM)。如果每次修改数据都会走一遍这个流程是非常消耗性能的,所以使用异步更新 DOM 的策略,先对数据修改进行整合再使用最终的整合结果一次性对 DOM 进行更新

3、获取更新后的 DOM

<template>
  <div class="test">
    <div>
      <button @click="test" ref="btn">{{ msg1 }}</button>
    </div>
    <div>
      <button @click="test2" ref="btn">{{ msg2 }}</button>
    </div>
  </div>
</template>
<script>
export default {
  data () {
    return {
      msg1: '按钮1',
      msg2: '按钮2'
    }
  },
  methods: {
    test () {
      this.msg1 = '信息改变了。。。。'
      console.log('打印结果:' + this.$refs.btn.innerText) // 打印结果:按钮
    },
    test2 () {
      this.msg2 = '使用this.$nextTick后'
      this.$nextTick(function () {
        console.log('打印结果:' + this.$refs.btn.innerText) // 打印结果:使用this.$nextTick后
      })
    }
  }
}
</script>

通过使用this.$nextTick,此时的打印结果就可以获取到打印结果:使用this.$nextTick后的信息。

4、小结:this.$nextTick()的使用场景

  • 在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中。原因是在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题 。
  • 在数据变化后要执行的某个操作,当你设置 this.msg1 = ‘信息改变了。。。。’ ,DOM并不会马上更新,而是在异步队列被清除,也就是下一个事件循环开始时执行更新时才会进行必要的DOM更新。如果此时你想要根据更新的 DOM 状态去做某些事情,就会出现问题。。为了在数据变化之后等待 Vue 完成更新 DOM ,可以在数据变化之后立即使用 Vue.nextTick(callback)这样回调函数在 DOM 更新完成后就会调用

到此这篇关于Vue中this.$nextTick()的具体使用的文章就介绍到这了,更多相关Vue this.$nextTick() 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue中this.$nextTick()的具体使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue中this.$nextTick()的具体使用

本文主要介绍了Vue中this.$nextTick()的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-06

Vue的this.$nextTick怎么使用

这篇“Vue的this.$nextTick怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue的this.$next
2023-07-04

vue中的nextTick的作用

vue里面,常用的事件onMounted里,总喜欢用一个nextTick: onMounted(() => { nextTick(() => { init(); });}); 这个东西有啥用呢?我总搞不懂。 今天我忽然有点明白了。
2023-08-30

Vue中使用TailwindCSS的具体方法

本文主要介绍了Vue中使用TailwindCSS的具体方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-14

Vue中$refs和$nextTick如何使用

本篇内容主要讲解“Vue中$refs和$nextTick如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue中$refs和$nextTick如何使用”吧!1、$refs简介$refs是v
2023-06-29

在vue中nextTick用法及nextTick的原理是什么

这篇文章主要介绍了在vue中nextTick用法及nextTick的原理是什么,Vue.js是一个流行的前端框架,它提供了一种响应式的数据绑定机制,使得页面的数据与页面的UI组件之间能够自动同步,需要的朋友可以参考下
2023-05-16

使用this.$nextTick()获取不到数据更新后的this.$refs.xxx.及场景分析

今天遇到了这样一个场景,在数据更新之后,使用this.$nextTick(()=>{console.log(this.$refs.xxx)})获取不到改dom,但是用setTimeout能够获取到,在此记录一下,感兴趣的朋友跟随小编一起看看吧
2023-02-06

Python中collections.Counter()的具体使用

目录Counter类创建计数值的访问与缺失的键计数器的更新键的删除elements()most_common([n])fromkeys浅拷贝copy算术和集合操作常用操作Counter类Counter类的目的是用来跟踪值出现的次数。它是一个
2022-06-02

python中pywifi的具体使用

本文主要介绍了python中pywifi的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-06

java中Thread.sleep()的具体使用

本文主要介绍了 java中Thread.sleep()的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-17

编程热搜

目录