v-if="false"时,在该位置创建一个注释节点,用来标识元素在页面中的位置。在值发生改变的时候,通过diff,新旧组件进行patch,创建DOM节点,从而动态显示隐藏。v-show="false"时,通过设置元素的样式,display:none来控制元素是否展示。| - | v-if | v-show |
|---|---|---|
| 本质 | 操作DOM元素进行切换显示 | 设置css样式进行切换显示 |
| 首次渲染开销 | 较低 | 较高 |
| 切换开销 | 较高 | 较低 |
| 适用场合 | 不频繁切换 | 频繁切换 |
| 对生命周期的影响 | 会影响 | 不会影响 |
vue2/vue3行为一致,v-if和v-show都会导致父组件更新视图,所以会触发父组件的beforeUpdate和updated钩子函数
vue3的生命周期函数beforeDestroy与destroyed变成了beforeUnmount与unmounted
vue2中v-if包裹子组件
false转为truebeforeUpdate -> 子beforeCreate -> 子created -> 子beforeMount -> 子mounted -> 父updatedtrue转为falsebeforeUpdate -> 子beforeDestroyed -> 子destroyed -> 父updatedvue3中v-if包裹子组件:与vue2相同,个别钩子函数名不同
false转为truebeforeUpdate -> 子beforeCreate -> 子created -> 子beforeMount -> 子mounted -> 父updatedtrue 转为falsebeforeUpdate、子beforeUnmount、unmounted、父updated。vue2中v-show包裹子组件
false转为truebeforeUpdate -> 父updatedtrue转为falsebeforeUpdate->父updatedvue3中v-show包裹子组件:会触发子组件updated
false转为truebeforeUpdate -> 子beforeUpdate->子updated->父updatedtrue转为falsebeforeUpdate -> 子beforeUpdate-> 子updated->父updated