v-for 和 v-if 一同使用
永远不要把 v-if 和 v-for 同时用在同一个元素上。
当 Vue 处理指令时,v-for 比 v-if 具有更高的优先级,所以这个模板:
<ul><liv-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"><liv-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><liv-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><liv-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"><liv-for="user in users":key="user.id">{{ user.name }}</li></ul>
将 v-if 置于外层元素上,我们不会再对列表中的每个用户检查 shouldShowUsers。取而代之的是,我们只检查它一次,且不会在 shouldShowUsers 为否的时候运算 v-for。
