返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue nextTick获取更新后的DOM的实现
  • 388
分享到

Vue nextTick获取更新后的DOM的实现

2024-04-02 19:04:59 388人浏览 八月长安
摘要

目录生命周期 updateVue.nextTickPromise结语&参考资料前两天在开发时遇到一个需求:打开对话框的时候自动聚焦其中的输入框。由于原生的 autofocus

前两天在开发时遇到一个需求:打开对话框的时候自动聚焦其中的输入框。由于原生的 autofocus 属性不起作用,需要使用组件库提供的 focus 方法手动手动获取焦点。于是有如下代码:

<el-button @click="openDialog">点击打开 Dialog</el-button>

<el-dialog :visible.sync="dialogVisible">
  <el-input v-model="input" ref="input"></el-input>
</el-dialog>
methods: {
  openDialog() {
    this.dialogVisible = true;
    const input = this.$refs.input;
    input.focus();
  },
},

结果报错了,原因是没有获取到 input 组件;通过 log,也验证了 this.$refs.input 的值确实是 undefined。但是经过测试,如果对话框默认状态是打开的,就不会报错;明明组件就在那,为什么获取不到呢?

生命周期 update

经过分析,这种现象是由于 Vue 实例的更新机制造成的。从下方的生命周期图(局部)中可以看出,组件装载好之后,遇到数据变化时将重新渲染虚拟 DOM(可以理解为 html 中的组件节点)。在本例中,隐藏的 Dialog 组件(以及其中的 input 组件)本来并没有渲染在 DOM 中,是在观察到 dialogVisible 属性变为 true 后再进行更新渲染的。

而网页渲染通常是一个异步任务,因此在 visible 属性刚刚更改时(一个函数中是同步过程),DOM 渲染还没有进行,因此自然获取不到此时还不存在的 input 组件了。

关于异步、js任务队列、宏任务与微任务等概念的更多介绍,可参考博文JS多线程:任务队列

为了更直观地展示这个过程,可以在更新前后的钩子函数中试图获取组件并进行打印:

beforeUpdate() {
  console.log("beforeUpdate");
  const input = this.$refs.input;
  console.log(input);
},
updated() {
  console.log("updated");
  const input = this.$refs.input;
  console.log(input);
},
methods: {
  openDialog() {
    this.dialogVisible = true;
    console.log("click open");
  },
},

结果如下,可以验证之前的分析和猜想:

click open
beforeUpdate
undefined
updated
VueComponent {...}

Vue.nextTick

为了解决这个问题,Vue 提供了全局 api Vue.nextTick(),它的作用是提供下次 DOM 更新之后的回调。也就是说,在更新数据后调用 api,就能够获取到重新渲染后的 DOM 并进行相关操作。

nextTick 方法可以广泛适用于各种需要在数据更新后对相关 DOM 进行操作的情景,例如 v-if 、watch 等。

在上文的例子中再加入 nextTick:

openDialog() {
  this.dialogVisible = true;
  console.log("click open");
  this.$nextTick(function () {
    console.log("next tick");
    const input = this.$refs.input;
    console.log(input);
    input.focus();
  });
},

可以看到,回调确实是在 DOM 更新之后,也就是 updated 执行之后才执行的。获取组件与手动获得焦点的操作也能够正确执行了。

click open
beforeUpdate
undefined
updated
VueComponent {...}
next tick
VueComponent {...}

Promise

如果没有提供回调参数,并且浏览器支持 Promise,调用 nextTick 将返回一个 Promise。也就是说下面几种写法是等价的(环境支持的情况下):

Vue.nextTick(function () {...})
Vue.nextTick(() => {...})

Vue.nextTick().then(function () {...})
Vue.nextTick().then(() => {...})

关于 Promise 的介绍和用法,可以参考博文 JS Promise。

结语&参考资料

以上是个人对 Vue 中 nextTick api 的一些理解与思考,希望能给你提供帮助。如果有问题或疏漏之处,欢迎在评论中讨论与指正。

参考资料:

Vue 文档 - api

Vue 文档 - 实例

到此这篇关于Vue nextTick获取更新后的DOM的实现的文章就介绍到这了,更多相关Vue nextTick获取更新后的DOM内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue nextTick获取更新后的DOM的实现

本文链接: https://lsjlt.com/news/163636.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue nextTick获取更新后的DOM的实现
    目录生命周期 updateVue.nextTickPromise结语&参考资料前两天在开发时遇到一个需求:打开对话框的时候自动聚焦其中的输入框。由于原生的 autofocus...
    99+
    2024-04-02
  • Vue nextTick如何获取更新后的DOM的实现
    这篇文章将为大家详细讲解有关Vue nextTick如何获取更新后的DOM的实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前两天在开发时遇到一个需求:打开对话框的时候自动聚焦其...
    99+
    2023-06-28
  • Vue $nextTick能获取到最新Dom的原因是什么
    这篇文章主要介绍“Vue $nextTick能获取到最新Dom的原因是什么”,在日常操作中,相信很多人在Vue $nextTick能获取到最新Dom的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-07-04
  • Vue$nextTick为什么能获取到最新Dom源码解析
    目录正文修改数据之后update 方法nextTick 方法里面怎么执行传进去更新方法正文 <template> <p id='text'>{{tex...
    99+
    2022-11-13
    Vue $nextTick获取Dom Vue $nextTick
  • Vue批量更新dom的实现步骤
    目录场景介绍深入响应式触发getter寻找Dep.targetgettersetter总结场景介绍 在一个SFC(single file component,单文件组件)中,我们经...
    99+
    2024-04-02
  • vue异步更新dom的实现浅析
    目录Vue异步更新DOM的原理1 什么时候能获取到真正的DOM元素?2 为什么Vue需要通过nextTick方法才能获取最新的DOM?3 为什么this.$nextTick 能够获取...
    99+
    2024-04-02
  • VuenextTick延迟回调获取更新后DOM机制详解
    目录简述事件循环机制vue数据驱动视图的处理(异步变化DOM)Vue.nextTick原理Vue.nextTick的应用created生命周期中操作DOM修改数据,获取DOM值简述 ...
    99+
    2022-11-13
    vue nextTick延迟回调DOM vue nextTick
  • 使用this.$nextTick()获取不到数据更新后的this.$refs.xxx.及场景分析
    目录使用this.$nextTick()获取不到数据更新后的this.$refs.xxx.补充:详解Vue中this.$nextTick()用法使用this.$nextTick()获...
    99+
    2023-02-06
    this.$nextTick()获取不到数据 this.$nextTick()获取不到数据this.$refs.xxx. this.$nextTick()用法
  • Vue+echart 展示后端获取的数据实现
    最近在合作做一个前后端分离项目时,为了测试我写的后端部分获取数据的效果,自己也学了一下 vue 的知识,在获取 json 信息这里也踩了很多坑。 这里列举下我返回的 json 部分信...
    99+
    2023-01-18
    Vue echart 展示数据 Vue echarts后端数据
  • Vue获取DOM的几种方法总结
    目录Vue获取DOM的方法1、使用DOM API直接找元素2、refs3、使用自定义指令vue3.0获取虚拟dom方法Vue获取DOM的方法 Vue实现了MVVM模型,将数据和表现进...
    99+
    2022-11-13
    Vue获取DOM Vue获取DOM方法 Vue DOM
  • Vue异步更新机制和nextTick的原理是什么
    本篇内容介绍了“Vue异步更新机制和nextTick的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
  • 如何在Vue中获取DOM元素的实际宽高
    目录前言一、获取元素二、获取元素宽高补充:vue项目获取dom元素宽高总是不准确总结前言 最近使用 D3.js 开发可视化图表,因为移动端做了 rem 适配,所以需要动态计算获取图表...
    99+
    2024-04-02
  • Vue异步更新机制及$nextTick原理的深入讲解
    目录前言Vue的异步更新DOM更新是异步的DOM更新还是批量的事件循环执行过程源码深入异步更新队列nextTick$nextTick总结一般更新DOM是同步的既然更新DOM是个同步的...
    99+
    2024-04-02
  • vue中怎么获取dom元素中的内容
    vue中获取dom元素中内容的方法:vue中是通过给标签加ref属性,然后在js中利用ref去引用它,从而操作该dom元素。示例:<template>  <div>  &nbs...
    99+
    2024-04-02
  • vue 3.0 使用ref获取dom元素的示例
    前言 附上vue3.0文档:Vue3中文文档 - vuejs Vue 2.x获取DOM <div ref="myRef"></div> this.$refs....
    99+
    2024-04-02
  • Vue中获取DOM元素的方法有哪些
    本文小编为大家详细介绍“Vue中获取DOM元素的方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue中获取DOM元素的方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、通过 $refs 获取...
    99+
    2023-07-05
  • 详解React获取DOM和获取组件实例的方式
    目录React获取DOM的方式ref获取DOM元素ref获取组件实例React获取DOM的方式 ref获取DOM元素 在React的开发模式中,通常情况下不需要、也不建议直接操作DO...
    99+
    2024-04-02
  • react.js怎么获取真实的DOM节点
    这篇文章给大家分享的是有关react.js怎么获取真实的DOM节点的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为了获取真实的dom节点,文本输入框必须有一个 ref 属性,然后...
    99+
    2024-04-02
  • 探讨Vue中获取DOM元素的几种方法
    Vue是一种流行的JavaScript框架,它使开发人员可以轻松地构建交互式Web应用程序。其中一个常见的需求是在Vue组件中获取DOM元素,以便对其进行操作。但是,Vue有一些特殊的方式来获取DOM元素。在本文中,我们将探讨Vue中获取D...
    99+
    2023-05-14
  • vue this.$refs.xxx获取dom的注意事项是什么
    这篇文章主要介绍“vue this.$refs.xxx获取dom的注意事项是什么”,在日常操作中,相信很多人在vue this.$refs.xxx获取dom的注意事项是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作