vue为什么建议永远不要把 v-if 和 v-for 同时用在同一个元素上


vue为什么建议永远不要把 v-if 和 v-for 同时用在同一个元素上

在vue风格指南中,将”避免 v-if 和 v-for 用在一起”列为必要优先级,建议永远不要把 v-if 和 v-for 同时用在同一个元素上。官网文档如下:

一般我们在两种常见的情况下会倾向于这样做:

为了过滤一个列表中的项目 (比如 v-for=”user in users” v-if=”user.isShow”)。在这种情形下,请将 users 替换为一个计算属性 (比如 activeUsers),让其返回过滤后的列表。
为了避免渲染本应该被隐藏的列表 (比如 v-for=”user in users” v-if=”shouldShowUsers”)。这种情形下,请将 v-if 移动至容器元素上 (比如 ul、ol)。
实际运行时v-for 比 v-if 优先级高,来看个例子

<ul>
  <li
    v-for="user in users"
    v-if="user.isShow"
    :key="user.id"
  >
    {{ user.name }}
  </li>
</ul>

将进行如下计算,其实显示是正常的,但v-for会遍历所有的元素,哪怕我们只想通过v-if渲染出少部分元素,渲染逻辑里,每次重新渲染的时候都会遍历整个列表,并判断是否需要显示

this.users.map(function (user) {
  if (user.isShow) {
    return user.name
  }
})

这种情况,建议使用computed属性过滤需要显示的数组,这样渲染逻辑理就不用再加v-if判断了

computed: {
  activeUsers() {
    return this.users.filter(user=>user.isShow)
  }
}

在实际的使用场景中,如果渲染逻辑需要使用v-if过滤的情况,都可以尝试先考虑是否能使用computed属性代替,让渲染时只用考虑数据,不需要考虑逻辑。即 渲染 + 判断逻辑 + 数据 => 渲染 + 数据


文章作者: Mr. Zhan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Mr. Zhan !
 上一篇
vue在自定义组件上使用v-model指令 vue在自定义组件上使用v-model指令
vue在自定义组件上使用v-model指令在自定义组件上,使用v-model指令,默认会向子组件传递一个字段名为 value 的 prop 属性,以及绑定一个名为 input 的事件。在子组件里,可以用props来接收value字段,可以用
2021-01-18 Mr. Zhan
下一篇 
vue中.sync修饰符 vue中.sync修饰符
vue中.sync修饰符当一个属性传递给子组件后,子组件需要修改时,可以使用.sync修饰符 父组件中使用.sync修饰符<template> <div class="warp"> 父组件的msg值:{{msg}}
2021-01-15 Mr. Zhan
  目录