【发布时间】:2021-06-08 00:01:39
【问题描述】:
当挂载一个 Vue template ref 时,我想获取最近的父 Vue 组件。这应该是通用的并且适用于任何模板引用,所以我将它放在一个组合函数中(但这只是一个实现细节)。
我有这个工作,但我的实现在迭代搜索元素的祖先时使用了elem.__vueParentComponent。在阅读 Vue source code 时,我看到 __vueParentComponent 仅在开发模式下启用,或者在生产中启用了开发工具。因此,我不想依赖启用该标志。
我认为这可能使用 vnodes 来实现,但这在谷歌上并不容易。这是我正在尝试做的一个示例:
function useNearestParentInstance(templateRef) {
function getNearestParentInstance(el) {
// code here
}
onMounted(() => {
const el = templateRef.value;
const instance = getNearestParentInstance(el);
// do something with instance
});
}
<template>
<div>
<SomeComponent>
<div>
<div ref="myElem"></div>
</div>
</SomeComponent>
</div>
</template>
<script>
export default {
setup() {
const myElem = ref();
// nearest would be SomeComponent's instance in this case
useNearestParentInstance(myElem);
...
}
}
</script>
【问题讨论】:
-
在这种情况下,实际上并不需要以这种方式使用它,因为您可以在 SomeComponent 本身上使用 ref。
-
是的,我知道我可以添加一个额外的 ref,但这是一种以通用方式使用的东西,理想的实现不应要求此函数的用户为父组件创建一个 ref .
-
这个用例很难解释。我们正在将 Vue 与旧框架集成,我正在尝试进行无缝集成。使用模板 ref 调用
useNearestParentInstance对我的 lib 的用户来说是有意义的,但指定父级不会(如果模板更改导致缺陷,父级可能会更改)。 -
所以你需要最近的 VueParentInstance 对吧?这就是 div 父级不是有效 parentInstance 的原因
-
是的,没错。我需要访问最近的 Vue 实例的属性。
标签: vue.js vuejs3 vue-composition-api