永远不要把 v-if 和 v-for 同时用在同一个元素上。
一般我们在两种常见的情况下会倾向于这样做:
- 为了过滤一个列表中的项目 (比如
v-for="user in users" v-if="user.isActive"
)。在这种情形下,请将users
替换为一个计算属性 (比如activeUsers
),让其返回过滤后的列表。
- 比如
v-for="user in users" v-if="shouldShowUsers"
。这种情形下,请v-if
移动至容器元素上 (比如ul, ol
)。
1 | <ul> |
1 | computed: { |
我们将会获得如下好处:
过滤后的列表只会在
users
数组发生相关变化时才被重新运算,过滤更高效。使用
v-for="user in activeUsers"
之后,我们在渲染的时候只遍历活跃用户,渲染更高效。解耦渲染层的逻辑,可维护性 (对逻辑的更改和扩展) 更强。