vue3 setup访问子组件的 DOM 元素的示例代码

 更新时间:2023年08月29日 09:37:58   作者:ZerlinM  
使用setup的情况下这个时候我们无法使用this,注意在setup中setup是封闭的,不会将子组件事件暴露出来,所以要用defineExpose(),这篇文章主要介绍了vue3 setup访问子组件的 DOM 元素,需要的朋友可以参考下

vue3 setup访问子组件的 DOM 元素

使用setup的情况下这个时候我们无法使用this,注意在setup中setup是封闭的,不会将子组件事件暴露出来,所以要用defineExpose(),将需要在父组件调用的函数暴露出去,子组件代码如下:

<template>
  <div ref="domRef">
    <div>哈哈哈哈</div>
  </div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const domRef = ref(null)
const getRef = () => {
  return domRef.value
}
defineExpose({
  getRef
})
</script>

父组件:

<template>
  <PointPopup ref="popupRef" />
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import PointPopup from './components/PointPopup.vue'
const popupRef = ref(null)
onMounted(() => {
  // 打印子组件DOM
  console.log('child', popupRef?.value?.getRef())
})

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

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 元素可能仍然未完全渲染。这种情况通常发生在以下情况下:

  • 子组件包含异步操作或延迟加载的内容:如果子组件内部包含异步操作,例如从服务器加载数据或执行动画效果,子组件的 DOM 元素可能需要更长的时间才能完全渲染。
  • 父组件与子组件之间存在过渡效果:如果在父组件中使用了过渡效果(例如 < 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 元素。这对于执行诸如测量元素大小、计算位置、添加样式等操作非常有用。

到此这篇关于vue3 setup访问子组件的 DOM 元素的文章就介绍到这了,更多相关vue3 setup DOM 元素内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue3中hooks的简介及用法教程

    vue3中hooks的简介及用法教程

    vue3 中的 hooks 就是函数的一种写法,就是将文件的一些单独功能的js代码进行抽离出来,放到单独的js文件中,或者说是一些可以复用的公共方法/功能,这篇文章主要介绍了vue3中hooks的简介及用法,需要的朋友可以参考下
    2023-01-01
  • vue3+elementui-plus实现一个接口上传多个文件功能

    vue3+elementui-plus实现一个接口上传多个文件功能

    这篇文章主要介绍了vue3+elementui-plus实现一个接口上传多个文件,先使用element-plus写好上传组件,然后假设有个提交按钮,点击上传文件请求接口,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • vue中清除定时器的方法实例详解

    vue中清除定时器的方法实例详解

    很多情况下,进入和退出vue界面,都没有清除定时器,从而导致有很多定时器一起工作,这样肯定是不行的,下面这篇文章主要给大家介绍了关于vue中清除定时器的方法,需要的朋友可以参考下
    2023-02-02
  • Vue表单输入绑定的示例代码

    Vue表单输入绑定的示例代码

    这篇文章主要介绍了Vue表单输入绑定的示例代码,本文使用v-model指令在表单input创建双向数据绑定,非常具有实用价值,需要的朋友可以参考下
    2018-11-11
  • vue实现分页加载效果

    vue实现分页加载效果

    这篇文章主要为大家详细介绍了vue实现分页加载效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • echarts鼠标覆盖高亮显示节点及关系名称详解

    echarts鼠标覆盖高亮显示节点及关系名称详解

    下面小编就为大家分享一篇echarts鼠标覆盖高亮显示节点及关系名称详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • 简述vue状态管理模式之vuex

    简述vue状态管理模式之vuex

    这篇文章主要介绍了简述vue状态管理模式之vuex,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • vue+golang实现上传微信头像功能

    vue+golang实现上传微信头像功能

    这篇文章主要介绍了vue+golang实现上传微信头像功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-10-10
  • Vue+Openlayer实现图形的拖动和旋转变形效果

    Vue+Openlayer实现图形的拖动和旋转变形效果

    Openlayer具有自己的扩展插件ol-ext,可以用来实现图形的拖拽、旋转、缩放、拉伸、移动等操作,本文将主要介绍通过Openlayer实现图形的拖动和旋转,需要的同学可以学习一下
    2021-11-11
  • vue基于Teleport实现Modal组件

    vue基于Teleport实现Modal组件

    Teleport 提供了一种干净的方法,允许我们控制在 DOM 中哪个父节点下渲染了 HTML,而不必求助于全局状态或将其拆分为两个组件。
    2021-05-05

最新评论