vue3访问子组件的 DOM 元素的方法总结

在 Vue 3 中,访问子组件的 DOM 元素是一个常见的需求。本文将介绍如何在 Vue 3 中使用不同的方法来获取子组件的 DOM 元素。

方法一

使用refrefs:在父组件中,可以通过 refrefs 来获取子组件的 DOM 元素。在模板中使用 ref 声明引用变量,并将其绑定到子组件的 ref 属性上。然后,在父组件的钩子函数(如 mounted)中,通过 this.refs 访问子组件的引用,使用 .{refName} 来访问子组件实例的属性和方法。通过 .$el 可以获取子组件的 DOM 元素。

方法二

< script setup> 中访问子组件的 DOM 元素:在 Vue 3 中,可以使用 < script setup> 区块和 Composition API 的语法来编写组件逻辑。在父组件的 < script setup> 区块中,可以使用 onMounted 钩子函数来访问子组件的 DOM 元素。使用 ref 创建引用并绑定到子组件的 ref 属性上,然后在 onMounted 钩子函数中使用 childRef.value.$el 来访问子组件的 DOM 元素。

实例演示

image.png
image.png
但是会出现这种情况:
对于父组件的 mounted 钩子函数,确实表示父组件的模板已经被渲染成真实的 DOM。在大多数情况下,子组件也应该在父组件的 mounted 钩子函数执行时已经被渲染完成。
然而,由于 Vue 的异步渲染策略,某些情况下子组件的 DOM 元素可能仍然未完全渲染。这种情况通常发生在以下情况下:

  1. 子组件包含异步操作或延迟加载的内容:如果子组件内部包含异步操作,例如从服务器加载数据或执行动画效果,子组件的 DOM 元素可能需要更长的时间才能完全渲染。
  2. 父组件与子组件之间存在过渡效果:如果在父组件中使用了过渡效果(例如 < transition>< transition-group>),那么在父组件的 mounted 钩子函数中访问子组件的 DOM 元素时,可能会遇到过渡效果尚未完成的情况。

在这些情况下,尽管父组件的模板已经被渲染成真实的 DOM,但子组件的 DOM 元素可能尚未完全渲染。因此,在父组件的 mounted 钩子函数中立即访问子组件的 DOM 元素可能会导致获取到不完整或错误的信息。

  1. 使用 nextTick( ) 解决异步渲染问题:在某些情况下,子组件的 DOM 元素可能尚未完全渲染,即使在父组件的 mounted 钩子函数中。这是因为 Vue 的异步渲染策略。为了解决这个问题,可以使用 nextTick() 函数,在父组件的 mounted 钩子函数中等待子组件的 DOM 元素渲染完成后再进行操作。通过 nextTick() 函数可以确保获取到正确的子组件 DOM 元素。

方法三

使用setup的情况下这个时候我们无法使用this,注意在setup中setup是封闭的,不会将子组件事件暴露出来,所以要用defineExpose(),将需要在父组件调用的函数暴露出去,子组件代码如下:
image.png
父组件代码如下:
image.png
这种方法通常不需要考虑异步渲染的问题,是因为在子组件的 defineExpose 中,直接将 DOM 引用暴露给了父组件,而不需要等待异步操作完成。
通过使用 defineExpose 抛出 getDom 函数,在父组件中访问子组件的 DOM 元素。在这种情况下,getDom 函数返回的是 inpRef.value,即子组件的 DOM 元素。
因为这个引用是直接通过 ref 创建的,并在子组件的 defineExpose 中暴露给父组件,所以不需要考虑异步渲染的问题。当父组件的 mounted 钩子函数执行时,子组件的 defineExpose 已经完成,并且可以直接访问子组件的 DOM 元素。
所以,通过在子组件中抛出 DOM 的方式,可以直接在父组件中访问子组件的 DOM 元素,而不需要考虑异步渲染的延迟问题。也就无需加nextTick().

通过上述方法,可以在 Vue 3 中轻松地访问子组件的 DOM 元素。这对于执行诸如测量元素大小、计算位置、添加样式等操作非常有用。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue中,组件获取DOM元素方法有几种。一种是通过在组件的模板中使用`:ref`指令来给DOM元素添加一个引用,然后在父组件中可以通过`$refs`来访问这个引用。例如,可以在组件的模板中使用`:ref`指令来给一个div元素添加引用: ``` <template> <div ref="myDiv">这是一个div元素</div> </template> ``` 然后在父组件中,可以通过`this.$refs`来访问这个引用: ``` mounted() { console.log(this.$refs.myDiv); } ``` 另一种方法是通过在组件的`mounted`钩函数中使用`this.$el`来获取组件的根DOM元素。例如: ``` mounted() { console.log(this.$el); } ``` 这样就可以获取到组件的根DOM元素了。注意,这种方法只能在组件的`mounted`钩函数中使用,因为只有在组件挂载到DOM树上之后,才能获取到DOM元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Vue.js实例学习:获取DOM元素](https://blog.csdn.net/b954960630/article/details/87739962)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Vue3中操作dom的四种方式,建议收藏!!!](https://blog.csdn.net/qq_44880095/article/details/128721041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冷月半明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值