获得DOM节点

代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>

<div id="father">
    <h1>标题</h1>
    <p id="p1">p1</p>
    <p class="p2">p2</p>
</div>

    <script>
        //操作DOM对象
        /*
        * 核心
        * 浏览器网页就是一个DOM树形结构!
        * 1、更新:更新DOM节点
        * 2、遍历DOM节点:得到DOM节点
        * 3、删除:删除一个DOM节点
        * 4、添加:添加一个新的节点
        * 要操作一个DOM节点,就必须先要获得这个DOM节点
        * */

        //对应css选择器
        var h1 = document.getElementsByTagName("h1");
        var p1 = document.getElementById("p1");
        var p2 = document.getElementsByClassName("p2")
        var father = document.getElementById("father");

        var childrens = father.children;//获取父节点下的所有子节点
        //father.firstChild
        //father.lastChild

        //以上都是原生代码,之后尽量使用JQuery
    </script>
</body>
</html>
<think>好的,我现在需要解决用户在Vue3中通过ref绑定组件并获取底层DOM节点的问题。首先,我得回忆一下Vue3中ref的使用方式,特别是在获取DOM节点时的变化。根据用户提供的引用内容,Vue3的ref在获取DOM时和Vue2有所不同,尤其是在TypeScript环境下。 用户的问题涉及到当ref绑定到组件或者包裹组件的div时,如何获取实际的DOM节点。可能需要区分两种情况:一种是ref直接绑定到原生HTML元素,另一种是绑定到Vue组件的情况。对于原生元素,直接使用ref应该就可以访问到DOM节点,但如果是组件,可能需要通过组件的$el属性来访问其根元素。 引用[1]中的例子展示了在非TypeScript情况下,如何在模板中声明多个ref,但没有具体说明如何获取组件实例的DOM。而引用[2]则是在TypeScript中使用ref()函数,并在onMounted钩子中访问DOM节点。这里需要注意的是,当ref绑定到组件时,得到的是组件实例,而不是DOM节点。因此,要访问组件的根DOM元素,应该使用组件实例的$el属性。 接下来需要考虑在组合式API(script setup)中的写法,尤其是在TypeScript中的类型定义。例如,使用ref<HTMLElement | null>(null)来明确指定ref的类型,这样在访问value时,TypeScript不会报类型错误。同时,在组件的情况下,可能需要使用InstanceType来定义组件实例的类型,然后通过$el获取DOM节点。 另外,用户可能遇到的问题是,如果组件有多个根节点,Vue3会抛出警告,这时可能无法直接通过$el获取到期望的DOM元素。这种情况下,需要确保组件是单根元素的,或者采用其他方法,比如在组件内部使用ref暴露特定的DOM节点。 总结步骤应该是:1. 绑定ref到组件或元素;2. 在组件实例中通过$el访问根元素;3. 处理TypeScript类型声明;4. 注意多根节点的限制。同时,需要提供代码示例,说明如何在不同情况下正确获取DOM节点,并强调类型安全和生命周期钩子的使用。</think>在Vue3中通过ref获取组件底层DOM节点,可分为以下三种场景实现: ### 一、绑定原生HTML元素 ```vue <template> <div ref="myDiv">原生DOM元素</div> </template> <script setup lang="ts"> import { ref, onMounted } from 'vue' const myDiv = ref<HTMLElement | null>(null) onMounted(() => { console.log(myDiv.value) // 输出实际的div元素[^2] }) </script> ``` ### 二、绑定Vue组件 ```vue <!-- 父组件 --> <template> <ChildComponent ref="myComponent" /> </template> <script setup lang="ts"> import { ref, onMounted } from 'vue' import ChildComponent from './ChildComponent.vue' const myComponent = ref<InstanceType<typeof ChildComponent> | null>(null) onMounted(() => { console.log(myComponent.value?.$el) // 输出子组件的根DOM元素 }) </script> ``` ### 三、绑定多DOM节点 ```vue <template> <div v-for="i in 3" :key="i" :ref="setItemRef">{{ i }}</div> </template> <script setup lang="ts"> import { ref, onMounted } from 'vue' const itemRefs = ref<HTMLElement[]>([]) const setItemRef = (el: HTMLElement) => { if (el) itemRefs.value.push(el) } onMounted(() => { console.log(itemRefs.value) // 包含所有循环生成的div元素 }) </script> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值