Vue3 通过 ref 获取DOM节点 和 通过组件实例化返回根DOM节点

本文介绍了Vue3中模板引用的两种方式,包括在组件选项和组合式API中的使用,并通过案例展示了如何在组合式API中获取并操作DOM节点。同时,详细阐述了如何通过Vue3的createApp实例化组件,并通过实例的$el属性获取根DOM节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、模板引用,的两种写法

 获取DOM节点,属于vue 模板引用的知识点,

1. 在组件选项的文件中,模板引用方式

2. 在组合式API中模板引用发过誓

下面的案例是在 组合式API文件中使用的方式

<template>
  <div ref="wuzi">
    <h1>物资仓库</h1>
  </div>
</template>

<script setup>
import { ref, onMounted} from "vue";
// 模板中ref的名称,必须和变量名相同,且ref函数包裹null,必须return出去
const wuzi = ref(null);

onMounted(() => {
      //打印DOM节点
      console.log(wuzi.value);
 })

</script>

二、通过实例化组件返回根DOM节点

1. 组件实例化

目前Vue3组件的实例化,只能通过createApp 返回引用实例

    //定义具有组件选项的对象
    const Profile = {
        template: `<p class="demo">{{firstName}}</p>`,
        data() {
            return {
                firstName: '滕禹鑫的组件',
            }
        }
    }

    // 为Vue实例化,提供挂载的元素节点
    let divEle = document.createElement("div");

    //实例化 和 挂载,返回结果就是Vue实例
    let a = Vue.createApp(Profile).mount(divEle);

2. 通过实例属性 $el ,得到 该Vue实例的根DOM节点元素

 //定义组件
    const Profile = {
        template: `<p class="demo">{{firstName}}</p>`,
        data() {
            return {
                firstName: '滕禹鑫的组件',
            }
        }
    }
    // Vue组件实例化
    let divEle = document.createElement("div");
    let a = Vue.createApp(Profile).mount(divEle);

    //打印该实例的DOM节点
    let dom = a.$el;
    console.log(dom);

### Vue 2 Vue 3获取 DOM 元素的方法比较 #### 使用 `getElementById` 获取 DOM 元素高度 在 Vue 应用程序中,可以直接利用原生 JavaScript 的 `document.getElementById()` 函数来访问特定 ID 的 DOM 节点并读取其尺寸数据。例如,在模板内定义了一个具有唯一标识符 "myDiv" 的 div 后,可以在脚本部分这样写: ```javascript let height = document.getElementById(&#39;myDiv&#39;).offsetHeight; ``` 这种方法适用于任何版本的 Vue,并不依赖框架本身的特性[^1]。 #### 利用 `$refs` 引用机制 对于更集成的方式,则推荐采用 Vue 提供的响应式 API——即通过设置组件或 HTML 标签上的 `ref` 特性来进行引用绑定。这允许开发者以一种声明式的风格轻松定位页面中的任意节点而不必担心命名冲突等问题。 ##### Vue 2 实现方式 当处于 Vue 2 环境下时,只需简单地向目标元素附加一个名为 `ref` 的自定义属性,并赋予独一无二的名字作为标记;之后便能在实例上下文中经由 `this.$refs.<your-ref-name>` 访问到对应的真实 DOM 对象及其所有公开接口成员。 ```html <div ref="myDiv">Hello, world!</div> ``` 随后就可以像下面这样做: ```javascript // 假设当前是在 methods 或生命周期钩子里执行这段代码 console.log(this.$refs.myDiv.offsetHeight); ``` 此模式不仅限于静态测量工作,还支持动态更新后的即时反馈处理。 ##### Vue 3 改进之处 进入 Vue 3 新时代以后,虽然核心概念保持一致,但在语法糖衣之下隐藏着不少优化改进措施。最显著的变化之一就是引入 Composition API 取代 Options API 成为主要编程范式的同时也增强了对组合逻辑的支持力度。因此现在创建 refs 更加灵活多变,甚至能够跨越多个层次结构传递下去而不会丢失关联关系。 考虑这样一个场景:有一个父级容器包裹了一系列带有交互行为的小部件(如菜单项),此时如果想要批量控制这些子项目的显示状态或者收集它们各自的布局参数怎么办?借助新的 setup 函数配合 reactive/reactiveToRefs 就能实现高效管理复杂 UI 组件间的数据流交换过程[^2]。 具体来说,先按照常规套路指定好各处所需的 ref 名字,再利用 provide/inject 功能将共享资源暴露出来供后代子孙们享用。这样一来无论嵌套多么深都能确保一致性体验不受影响。 ```html <!-- 子组件 --> <template> <div class="icon-box"> <!-- ...其他无关紧要的内容... --> <div class="menu-box" v-for="(item, index) in iconMenus" :key="index" @click="clickItem(item)" ref="menuItemRefs"> ... </div> </div> </template> <script lang="ts"> import { defineComponent } from &#39;vue&#39;; export default defineComponent({ name: &#39;MenuItem&#39;, }); </script> ``` 而在父组件这边则负责初始化以及分发必要的配置选项给各个独立单元使用: ```typescript setup() { const menuItemRefs = ref([]); onMounted(() => { nextTick().then(() => { console.log(menuItemRefs.value.map(el => el.offsetHeight)); }); }); return { clickItem, menuItemRefs // 把这个数组提供出去让子组件挂载自己的 dom 上去 }; } ``` 这里值得注意的是,由于现代浏览器渲染管线的缘故,有时直接操作 DOM 并不能立即看到预期效果,所以最好搭配 `nextTick` 宏任务调度器一起等待重绘完成后再做下一步动作。 综上所述,无论是 Vue 2 还是升级版 Vue 3 都提供了多种途径让用户方便快捷地抓取所需视图片段的信息,只不过后者凭借更加现代化的设计理念进一步简化了开发流程提升了生产力效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@穷且益坚,不坠青云之志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值