VUE中v-for和v-if不能同时使用的问题

 

摘抄自:https://www.cnblogs.com/showjs/p/11376446.html

 

在开发时候碰到了一个问题:v-if和v-for不能同时使用:

<h-tab-pane
  v-for="(item, index) in tabItems"
  :key="index"
  :label="item.title"
  :id="item.id"
  :name="item.id"
  v-if="item.show"
>
  <comment :is="item.componentName"></comment>
</h-tab-pane>

查找资料,官方的例子如下:(风格指南:https://cn.vuejs.org/v2/style-guide/

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

原因:当 Vue 处理指令时,v-for 比 v-if 具有更高的优先级,所以上述模板会进行如下运算:

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

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

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

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

 


 

在找资料过程中,发现了另一种方法,实测可用:https://forum.vuejs.org/t/vue3-x-v-for-v-if-v-if-v-else/71414/3

<template v-for="(item, index) in tabItems">
  <h-tab-pane
    v-if="item.show"
    :key="index"
    :label="item.title"
    :id="item.id"
    :name="item.id"
  >
    <comment :is="item.componentName"></comment>
  </h-tab-pane>
</template>

 

posted @ 2019-11-26 16:14  smil、梵音  阅读(3097)  评论(0编辑  收藏  举报