父组件
<template>
<span ref="reference">text</span>
<c-child :target="$refs.reference"></c-child>
</template>
<script>
export default {
...etc,
mounted() {
console.log(this.$refs.reference) // output: c-child
}
}
</script>
子组件
<script>
export default {
...etc,
mounted() {
console.log(this.target) // output: undefined
}
}
</script>
目前使用的方法只能在父组件获得引用,子组件获取不到,我猜想是prop
传递发生在$refs
挂载之前,因为$refs
无响应模式,即使挂载后也无法触发子组件prop
更新,所以输出的是挂载之前传递的值(undefined)
因此想请问有什么其它方法吗?亦或是我理解错误?
问题已经解决很久了,还是自问自答一下吧。
看过element的解决方案是采用自定义指令
v-popover:name
+ref="name"
来实现,通过获取指令的binding
即name
在当前实例的$refs
中获取到目标组件的引用,再将指令元素挂载到目标组件的$refs
下因为逻辑有点绕,还要添加自定义指令略显麻烦,而且在实践中发现对组件的摆放顺序也有要求,后来发现有一种更简单的方法可以达到类似目的,且没有顺序限制
两种方法皆可,都有各自的特点,看自己的使用情况选择吧
2017-02-27 更新
编写组件时发现第二种方法有个致命问题:popover组件的祖先不能有其他的组件,不然
$parent
将指向最近的一个祖先组件。然后结合第一种方法做出修改