我在获取一个兄弟组件的子组件的时候遇到一个问题
组件的层级关系如下: 我是要从header组件中调用table组件中的一个方法
index.vue
header.vue
footer.vue
table.vue
从header开始:
this.$parent.$refs.footer.$refs.table.function()
这时候报错 function is not defined 这个function 代表函数名
刚开始以为是层级太多获取不到,不知道会不会有这个问题,但是我这里应该不是这个问题。
因为我这里的table组件是用 v-if 来切换展示的,所以会因为样式渲染了但是数据没过来,导致方法或者变量是undefined
最后解决办法是v-if换成 v-show,不过if show 的区别还是要搞清楚,以免出现其他位置的错误。
if和show的区别:
v-show和v-if都是用来显示隐藏元素,v-if还有一个v-else配合使用,两者达到的效果都一样,性能方面去有很大的区别。
v-show
v-show不管条件是真还是假,第一次渲染的时候都会编译出来,也就是标签都会添加到DOM中。之后切换的时候,通过display: none;样式来显示隐藏元素。
可以说只是改变css的样式,几乎不会影响什么性能。
v-if
在首次渲染的时候,如果条件为假,什么也不操作,页面当作没有这些元素。当条件为真的时候,开始局部编译,动态的向DOM元素里面添加元素。
当条件从真变为假的时候,开始局部编译,卸载这些元素,也就是删除。
性能方面
v-if绝对是更消耗性能的,因为v-if在显示隐藏过程中有DOM的添加和删除,v-show就简单多了,只是操作css。
使用场景
因为v-show无论如何都会渲染,如果在一些场景下很难出现,那么使用v-if。如果是一些固定的,条件内容都不怎么会改变的,频繁切换的,使用v-show会比较省性能。
如果是子组件,每次切换子组件不执行生命周期,使用v-show,如果子组件需要重新执行生命周期,那么使用v-if才能触发。