Vue 组件通信 – 特殊情况:$refs 和 $parent
Vue 中,有着十分方便的工具,使用它们的同时,遵循一些规则,可以很大程度上提高代码的可读性。
但,日常使用过程中,会出现一些情况,让我们不想遵守这些规则,这时,可以“被迫”使用一些 Vue 不推荐的方法。
$refs 和 $parent
对于父子组件之间的通信,props 和 $emit 可以很方便的进行父子组件的数据传递,但是有些情况依然无法满足。
比如,父组件如果想要调用子组件中的方法,将变得非常复杂。这时,
- 可以使用 $refs 来获取子组件中的内容
- 也可以在子组件中,使用 $parent 获取父组件的内容
通过这种方式,子组件中可以调用父组件函数,也可以直接调用父组件的变量,只是这样做可能会使项目的调试和理解变得更加困难,所以,还是慎用 $refs 和 $parent 为好。
同时,因为 $refs 是在组件渲染完成之后生效,并非响应式,所以在模板或者计算属性中使用 $refs 是不可行的。
// 父组件 <template> <div id="app"> <!-- 给组件添加ref属性,此时this.$refs.childComponent指向子组件 --> <Child ref="childComponent"></Child> // childComponnets可以自定义名称 <button @click="getChildFunc">按钮</button> </div> </template> <script> import Child from './components/Child.vue'; export default{ data(){ return{ } }, components:{ Child }, methods:{ getChildFunc(){ // 可以使用 $refs 来调用子组件中的方法 this.$refs.childComponent.childFunc(); } } } </script>
<!-- 子组件 Child.vue --> <template> <div id="content"> <span>{{msg}}</span> <button @click="getParentFunc">子组件按钮</button> </div> </template> <script> export default{ data(){ return{ msg:'Hello' } }, methods:{ childFunc(){ this.msg = 'World' }, getParentFunc(){ 同样的,在子组件中可以使用$parent调用父组件中的方法 this.$parent.getChildFunc(); } } } </script>