v-for 和 v-if 一同使用
永远不要把 v-if 和 v-for 同时用在同一个元素上。
当 Vue 处理指令时,v-for 比 v-if 具有更高的优先级,所以这个模板:
<ul>
<li
v-for="user in users"
v-if="user.isActive"
:key="user.id"
>
{{ user.name }}
</li>
</ul>
将会经过如下运算:
this.users.map(function (user) {
if (user.isActive) {
return user.name
}
})
因此哪怕我们只渲染出一小部分用户的元素,也得在每次重新渲染的时候遍历整个列表,不论活跃用户是否发生了变化。
所以以下两种场景,我们可以做出如下处理:
为了过滤一个列表中的项目。
<ul id="app">
<li
v-for="user in users"
v-if="user.isActive"
:key="user.id"
>
{{ user.name }}
</li>
</ul>
const vm = new Vue({
el: '#app',
data: {
users: [
{ name: 'shan', isActive: true, id: 1},
{ name: 'jc', isActive: false, id: 2},
{ name: 'cst', isActive: false, id: 3},
{ name: 'deng', isActive: true, id: 4},
]
}
})
可以把上面的代码更新为:
<!-- 通过原来的数组,得到一个新数组,渲染这个新的数组 -->
<ul>
<li
v-for="user in activeUsers"
:key="user.id"
>
{{ user.name }}
</li>
</ul>
const vm = new Vue({
el: '#app',
data: {
users: [
{ name: 'shan', isActive: true, id: 1},
{ name: 'jc', isActive: false, id: 2},
{ name: 'cst', isActive: false, id: 3},
{ name: 'deng', isActive: true, id: 4},
],
activeUsers: []
}
})
vm.activeUsers = vm.users.filter(user => user.isActive);
这种方式仅为演示,在日后学习完计算属性后,要利用计算属性来做。
为了避免渲染本应该被隐藏的列表
<ul>
<li
v-for="user in users"
v-if="shouldShowUsers"
:key="user.id"
>
{{ user.name }}
</li>
</ul>
const vm = new Vue({
el: '#app',
data: {
users: [
{ name: 'shan', isActive: true, id: 1},
{ name: 'jc', isActive: false, id: 2},
{ name: 'cst', isActive: false, id: 3},
{ name: 'deng', isActive: true, id: 4},
],
shouldShowUsers: false
}
})
html部分可替换成为:
<ul v-if="shouldShowUsers">
<li
v-for="user in users"
:key="user.id"
>
{{ user.name }}
</li>
</ul>
将 v-if 置于外层元素上,我们不会再对列表中的每个用户检查 shouldShowUsers。取而代之的是,我们只检查它一次,且不会在 shouldShowUsers 为否的时候运算 v-for。