其实两者从定义上讲区别还是挺明显的:
v-if
:用于条件性地显示或隐藏一个元素,适用于简单的条件渲染。
component
:通过:is
属性实现组件的动态切换,适用于更复杂的条件渲染场景,可以根据条件加载不同的组件
那为什么要单独拧出来说呢?是因为两者在特殊情况下是具有一致性的..😟😟😟
相同点
仅从切换单个组件渲染的角度来讲:component
动态组件可以理解为就是 v-if
控制显示的语法糖。
试想一个场景,当我们需要从很多个组件中挑选一个进行渲染的时候,使用 v-if
就会显得特别的臃肿,这个时候切换到 component
渲染,可以增加代码的可读性和可维护性
例如:
<template>
<div>
<MyComponentA v-if="showComponentName === 'MyComponentA'">A</MyComponentA>
<MyComponentB v-if="showComponentName === 'MyComponentB'">B</MyComponentB>
<MyComponentC v-if="showComponentName === 'MyComponentC'">C</MyComponentC>
<MyComponentD v-if="showComponentName === 'MyComponentD'">D</MyComponentD>
<MyComponentE v-if="showComponentName === 'MyComponentE'">E</MyComponentE>
<MyComponentF v-if="showComponentName === 'MyComponentF'">F</MyComponentF>
</div>
</template>
<script>
import MyComponentA from './MyComponentA.vue';
import MyComponentB from './MyComponentB.vue';
import MyComponentC from './MyComponentC.vue';
import MyComponentD from './MyComponentD.vue';
import MyComponentE from './MyComponentE.vue';
import MyComponentF from './MyComponentF.vue';
export default {
data() {
return {
showComponentName: 'MyComponentA',
};
},
components: {
MyComponentA,
MyComponentB,
MyComponentC,
MyComponentD,
MyComponentE,
MyComponentF,
},
};
</script>
是不是看着都挺累….
这个时候我们就可以使用 component
组件来渲染,这样代码看起来就简洁多了:
<template>
<div>
<component :is="showComponentName"></component>
</div>
</template>
<script>
export default {
data() {
return {
showComponentName: 'MyComponentA',
};
},
components: {
MyComponentA: () => import('./MyComponentA.vue'),
MyComponentB: () => import('./MyComponentB.vue'),
MyComponentC: () => import('./MyComponentC.vue'),
MyComponentD: () => import('./MyComponentD.vue'),
MyComponentE: () => import('./MyComponentE.vue'),
MyComponentF: () => import('./MyComponentF.vue'),
},
};
</script>
为什么说这种模式下,component
可以理解为 v-if
的语法糖?
当通过
is
切换component
组件显示时,对比v-if
页面渲染和钩子函数的执行情况,两者是一致的。
除此之外:
不同点
v-if
旨在控制单个元素的渲染,并未限制元素是否为独立组件v-if
适合简单的渲染场景,使用起来也更加的灵活,而component
局限于多选一的情况一个是指令,一个是组件,两者实现和实际用法不一样,只有在特定情况下两者是一致的。