CSY247
CSY247
标签
标签tag ∈ [1, N] · one; one ∈ [0, 5] · tag
独立
独立独立于本网站的应用、网页、服务、插件等。
v-if | v-show | |
---|---|---|
控制手段 | dom 元素整个添加或删除 | css 中 display:none |
编译过程 | v-if 切换有一个局部编译/卸载的过程 | 简单的基于 css 切换 |
编译条件 | 渲染条件为假时,并不做操作,直到为真才渲染 | 始终渲染 |
性能消耗 | 更高的切换消耗 | 更高的初始渲染消耗 |
v-if 变为true
时,触发 beforeCreate
、create
、beforeMount
和 mounted
钩子。
v-if 变为 false
时,触发 beforeDestory
和 destoryed
钩子。
当 v-if
中表达式的值为 false
时,不会渲染其中的 dom。所以其中可能出现的问题也不会出现。
<template>
<div v-if="false">{{ data.a }}</div>
</template>
不存在 data.a
时不报错
<template>
<div v-show="false">{{ data.a }}</div>
</template>
不存在 data.a
时报错
优先级问题:当 v-if
和 v-for
同时用在同一个元素上时,v-for
有更高的优先级。这意味着 v-if
将分别重复运行于每个 v-for
循环中,即先进行循环,然后在每个循环中再进行条件判断。这会导致即使某些元素因为 v-if
的条件不满足而不会被渲染,Vue 仍然会先遍历整个列表,这会带来性能方面的浪费。
性能考虑:如果列表很长,但只有少数几项满足 v-if
的条件,每次渲染时仍然需要遍历整个列表,这会增加不必要的计算量。例如,如果有一个包含 1000 个用户的列表,但只有 10 个用户是活跃的,并且你只想显示这些活跃用户,使用 v-if
和 v-for
一起会导致每次都遍历 1000 个用户,而不是只处理那 10 个活跃用户。
v-if
用于控制部分渲染时:使用计算属性(computed
)来预先过滤列表,这样 v-for
可以直接迭代过滤后的数组。<template>
<ul>
<li v-for="user in activeUsers" :key="user.id">...</li>
</ul>
</template>
<script>
export default {
computed: {
activeUsers() {
return this.users.filter((user) => user.isActive);
},
},
};
</script>
v-if
用于控制全部数据渲染时:将 v-if
放在包含 v-for
的 <template>
标签上,这样可以先进行条件判断,再渲染列表。<template v-if="todos.length">
<TodoItem v-for="todo in todos" :key="todo.id" />
</template>
✨相关推荐✨