我想从父组件中获取vue.js组件的尺寸(我正在使用实验性的script setup)。
当我在组件内部使用ref时,它会按预期工作。我得到尺寸:
// Child.vue
<template>
<div ref="wrapper">
// content ...
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
const wrapper = ref(null)
onMounted(() => {
const rect = wrapper.value.getBoundingClientRect()
console.log(rect) // works fine!
})
</script>
字符串
但我想得到父零部件内部的尺寸。这可能吗?
我试过这个:
// Parent.vue
<template>
<Child ref="wrapper" />
</template>
<script setup>
import Child from './Child'
import { ref, onMounted } from 'vue'
const wrapper = ref(null)
onMounted(() => {
const rect = wrapper.value.getBoundingClientRect()
console.log(rect) // failed!
})
</script>
型
控制台记录此错误消息:第一个月
在文档中,我只能找到在子组件中使用template refs
的方法
这种方法是否不起作用,因为参考文件是“默认关闭”的RFCS描述说?
6条答案
按热度按时间3bygqnnd1#
我今天遇到了这个问题。问题是,当使用
<script setup>
模式时,没有返回任何声明的变量。当你得到一个组件的引用时,它只是一个空对象。解决这个问题的方法是在setup块中使用defineExpose
。字符串
您在父级中设置模板参考的方式很好。您在控制台中看到
empty object { }
这一事实意味着它正在工作。就像前面提到的另一个答案一样,可以从父对象访问子对象ref,如下所示:
wrapper.value.wrapper.getBoundingClientRect()
的值。RFC中有一节讨论了如何/为什么这样做:https://github.com/vuejs/rfcs/blob/master/active-rfcs/0040-script-setup.md#exposing-components-public-interface
同样重要的是要注意,使用
<script setup>
模式,父组件中的引用将不是ComponentInstance。这意味着你不能像其他方式那样在上面调用$el
。它只包含您在defineExpose
中输入的值。oxosxuxt2#
我不认为这一定与
<script setup>
标签有关。即使在标准脚本语法中,第二个示例也不能按原样工作。问题是您将
ref
直接放在Child组件上:字符串
并且对组件的引用与对该组件的 root 元素的引用NOT相同。它没有
getBoundingClientRect()
方法。事实上,Vue 3不再要求组件有一个根元素。您可以将子组件定义为:
型
现在父组件中的ref应该是什么?
从父组件将
wrapper.value
记录到控制台。它实际上是Child组件中所有引用的对象:型
你可以做
wrapper.value.wrapper1.getBoundingClientRect()
,这会很好。0yg35tkg3#
您可以使用
$el
字段访问根元素,如下所示:字符串
uplii1fm4#
好吧,你要做的是:
字符串
和/或
型
要了解原因,我们需要查看
ref
上的Vue文档:Vue特殊属性“ref”。关于(模板)
ref
的动态绑定,它说:型
由于
prop
允许您将数据从父节点传递给子节点,因此我们可以使用prop
和动态ref
绑定的组合来获得所需的结果。首先,我们将动态ref
回调函数作为getRef
prop
传递给子对象:型
然后,子元素在元素上执行动态
ref
绑定,其中它将目标el
分配给它的wrapper
ref
,并在该回调函数中调用getRef
prop
函数,让父元素也获取el
:型
请注意,这允许我们在父组件和子组件中都拥有
wrapper
元素的ref
。如果您希望在父组件中only访问wrapper
元素,您可以跳过子组件的回调函数,只需像这样将ref
绑定到prop
:型
这将使只有父级具有模板
wrapper
的ref
。vmpqdwk35#
如果你看到的
wrapper.value
是null
,那么请确保你试图让ref
的元素没有隐藏在一个假的v-if
下。Vue不会示例化ref
,直到实际需要该元素。我意识到这个答案不适用于当前的问题,但它是“template ref null vue 3 composition API”的顶级结果,所以我怀疑更多像我一样的人会来到这里,并会欣赏这个诊断。
3duebb1j6#
稍微紧凑一点:
字符串