Vue中获取DOM节点的方法实现

 更新时间:2026年08月16日 15:21:01   作者:Seal^_^  
本文深入探讨了Vue中获取DOM节点的核心方法,包括Vue2的ref API、Vue3的DOMRef以及$nextTick的应用场景,帮助开发者掌握Vue中DOM操作的最佳实践,感兴趣的可以了解一下

1.1 Vue 数据驱动机制与 DOM 操作的必要性

Vue 是一个流行的 JavaScript 框架,其核心思想是数据驱动视图,即数据的变化会自动反映到 DOM 上。然而,在实际开发中,我们经常需要直接操作 DOM 元素,例如调用第三方库的 API 或计算复杂的滚动位置。因此,掌握如何获取 DOM 节点对于开发者来说至关重要。

1.2 获取 DOM 的核心目标

我们获取 DOM 节点通常是为了获取其属性、内容或将其作为事件目标。Vue 推荐尽量避免直接操作 DOM,只有在确实需要时才进行操作,以减少对框架内部状态的破坏。

2.1 ref 的基本使用

在 Vue 2 中,最常用的获取 DOM 节点的方法是使用 ref 属性。在模板元素上绑定 ref,可以在组件实例中通过 this.$refs 访问该 DOM 元素。

<template>
  <div id="app">
    <div ref="myBox">我是 DOM 节点</div>
    <button @click="handleClick">获取节点</button>
  </div>
</template>

<script>
export default {
  methods: {
    handleClick() {
      const domNode = this.$refs.myBox;
      console.log(domNode.innerText);
    }
  }
}
</script>

2.2 ref 在 v-for 循环中的应用

当 ref 用于列表渲染时,this.$refs.refName 会是一个数组,包含所有匹配该 ref 值的元素。

<div ref="container" v-for="(item, index) in list" :key="index">
  {{ item }}
</div>

要获取特定的某个 DOM 节点,可以直接通过数组的下标访问:this.$refs.container[index]。

2.3 组件 ref

除了 DOM 元素,ref 还可以用于获取子组件的实例。这允许父组件访问子组件的属性和方法。

<child-component ref="child"></child-component>

访问时:this.$refs.child.someMethod()。

3.1 Vue 3 的 DOMRef

在 Vue 3 中,特别是在使用 Composition API 和 <script setup> 语法时,获取 DOM 的方式发生了变化。ref 变量可以直接在模板中绑定,无需通过 this.$refs。

<script setup>
import { ref, onMounted } from 'vue';

const myBox = ref(null);

onMounted(() => {
  if (myBox.value) {
    console.log(myBox.value.innerText);
  }
})
</script>

<template>
  <div ref="myBox">Vue 3 获取节点</div>
</template>

3.2 $nextTick 的作用

Vue 的 DOM 更新是异步的。当你修改数据时,Vue 不会立即重新渲染页面,而是把数据放在一个队列中,等同一个“事件循环”中的所有数据变化完成后再统一渲染。

如果在数据修改后立即通过 ref 获取 DOM,可能会获取到旧的 DOM 状态。这时需要使用 $nextTick 方法,等待 DOM 更新完成后再执行操作。

methods: {
  updateData() {
    this.message = '新内容';
    // 此时获取 DOM 可能是旧的
    console.log(this.$refs.myBox.innerText);
    
    this.$nextTick(() => {
      // 这里 DOM 已经更新,可以安全操作
      console.log(this.$refs.myBox.innerText); // 输出 '新内容'
    });
  }
}

4.1 DOM 操作流程解析

Vue 中的 DOM 操作通常涉及数据的变更、DOM 的更新以及最终的获取与操作。为了更清晰地展示这一过程,我们可以参考以下流程图。

4.2 完整流程图

5.1 最佳实践总结

在使用 Vue 获取 DOM 节点时,应遵循以下原则:

  1. 优先使用 ref:在 Vue 2 中使用 this.$refs,在 Vue 3 中使用 <script setup> 下的 ref 变量。
  2. 注意异步更新:操作 DOM 前务必检查 DOM 是否已渲染,必要时使用 $nextTick。
  3. 避免过度依赖:尽量避免深层操作 DOM,尽量通过 Vue 的数据绑定来解决大部分问题。

5.2 结语

获取 DOM 节点是 Vue 开发中的基础技能,理解 ref 和 $nextTick 的机制能够帮助开发者编写出更健壮的代码。希望本文的详解能对你的前端开发有所帮助。

到此这篇关于Vue中获取DOM节点的方法实现的文章就介绍到这了,更多相关Vue 获取DOM节点内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue3 vite ant deign vue黑暗模式实现过程

    vue3 vite ant deign vue黑暗模式实现过程

    该文章介绍了如何通过CSS变量和全局CSS文件实现黑暗模式,主要内容包括:创建`dark.less`和`light.less`文件对应黑暗和白天模式,使用CSS变量替换原有数值,编写切换CSS函数及切换黑暗/白天模式的函数,使用此方法,只需调用切换函数即可实现模式切换
    2026-04-04
  • Vue指令之 v-cloak、v-text、v-html实例详解

    Vue指令之 v-cloak、v-text、v-html实例详解

    当用户频繁刷新页面或网速慢时,页面未完成 Vue.js 的加载时,导致 Vue 来不及渲染,这就会导致在浏览器中直接暴露插值(表达式),这篇文章主要介绍了Vue指令 v-cloak、v-text、v-html,需要的朋友可以参考下
    2019-08-08
  • vue自定义开发滑动图片验证组件

    vue自定义开发滑动图片验证组件

    这篇文章主要为大家详细介绍了vue自定义开发滑动图片验证组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 在vue中使用console.log无效的解决

    在vue中使用console.log无效的解决

    这篇文章主要介绍了在vue中使用console.log无效的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 对vue2.0中.vue文件页面跳转之.$router.push的用法详解

    对vue2.0中.vue文件页面跳转之.$router.push的用法详解

    今天小编就为大家分享一篇对vue2.0中.vue文件页面跳转之.$router.push的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Vue打印错误日志问题

    Vue打印错误日志问题

    这篇文章主要介绍了Vue打印错误日志问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Vue.js上传图片到阿里云OSS存储的方法示例

    Vue.js上传图片到阿里云OSS存储的方法示例

    这篇文章主要介绍了Vue.js上传图片到阿里云OSS存储的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Vue项目中接口调用的详细讲解

    Vue项目中接口调用的详细讲解

    应公司需求,接口需要对接vue,记录一下碰到的问题,下面这篇文章主要给大家介绍了关于Vue项目中接口调用的详细讲解,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • vuejs 单文件组件.vue 文件的使用

    vuejs 单文件组件.vue 文件的使用

    本篇文章主要介绍了vuejs 单文件组件.vue 文件的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • vue制作toast组件npm包示例代码

    vue制作toast组件npm包示例代码

    这篇文章主要介绍了vue制作一个toast组件npm包,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10

最新评论