"Error: At least one element required."报错解决之v-if与v-show的区别

1,089 阅读1分钟

背景

在需求开发过程中,需要用到element-resize-detector来监控组件尺寸变化。 使用方式如下:

import elResize from 'element-resize-detector';

const er = elResize();
er.listenTo(this.$refs.item, (e) => {
  this.update(e);
});

但是控制台会报错,并且页面上的其他组件也无法正常使用了:

SCR-20220914-jr9-2.png

查看报错详细信息可看出是引用的element-resize-detector中的listenTo出了问题。

SCR-20220914-jru.png

报错上说,至少需要一个元素存在。那么经过代码排查发现我在组件中使用了v-if。改为v-show就好了。

那么就涉及到了v-if和v-show的区别。

v-if和v-show

v-if:为true时内容被渲染,为false时元素不存在于文档中;

v-show:内容总会被渲染,true/false只是基于css的样式切换,元素始终存在于文档中。

此时才感觉以前没有真正理解其意义,现在回过头来看使用场景的选择,才发现,嗷~原来如此。

1.v-if在条件切换时,会对标签进行适当的创建和销毁,而v-show则仅在初始化时加载一次,因此v-if的开销相对来说会比v-show大。
2.v-if是惰性的,只有当条件为真时才会真正渲染标签;如果初始条件不为真,则v-if不会去渲染标签。v-show则无论初始条件是否成立,都会渲染标签,它仅仅做的只是简单的CSS切换。

学习文档:v-show和v-if有什么区别?使用场景分别是什么?