避免v-if和v-for用在一起

v-if和v-for一起使用,v-for的优先级要高于v-if

  • 为了过滤一个列表中的项目(比如v-for = "user in users" v-if = "user.isActive")。在这种情况下,请将users替换为一个计算属性(比如activeUsers),让其返回过滤后的列表。
  • 为了避免渲染本应该被隐藏的列表(比如v-for = "user in users" v-if = "shouldShowUsers")。这种情况下,请将v-if移动至容器元素上(比如ulol)。

详解

当vue处理指令时,v-forv-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
  }
})

因此,哪怕我们只渲染出一小部分的用户元素,也得在每次重新渲染的时候遍历整个列表,不论活跃用户是否发生了改变。

通过将其更换为如下的一个计算属性上遍历:

computed: {
  activeUser: function () {
    return this.users.filter(function (user) {
      return user.isActive
    })
  }
}
<ul>
  <li
      v-for = "user in activeUsers"
      :key = "user.id"
  >
    {{ user.name }}
  </li>
</ul>

我们将会获得如下好处:

  • 过滤后的列表只会在 users 数组发生相关变化时才被重新运算,过滤更高效。
  • 使用 v-for = "user in activeUsers"之后,我们在渲染的时候只遍历活跃用户,渲染更高效。
  • 解藕渲染层的逻辑,可维护性 (对逻辑的更改和扩展) 更强。

也可以把:

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

更新为:

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

通过将v-if移动到容器元素,我们不会再对列表中的每个用户检查shouldShoeUsers。取而代之的是,我们只检查一次,且不会在shouldShoeUsers为否的时候运算v-for

反例

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

好例子

<ul>
  <li
    v-for="user in activeUsers"
    :key="user.id"
  >
    {{ user.name }}
  </li>
</ul>
<ul v-if="shouldShowUsers">
  <li
    v-for="user in users"
    :key="user.id"
  >
    {{ user.name }}
  </li>
</ul>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容