摘抄自: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>

