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

在 Vue 中,应当避免将 v-if 和 v-for 同时用于同一元素,这可能导致性能下降。正确的做法是,1) 使用计算属性过滤列表,如 `activeUsers` 替代 `users`,或者 2) 将 v-if 移动到容器元素(如 ul)上以控制整个列表的渲染。遵循这些最佳实践可以提升应用的性能。

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

永远不要把 v-if 和 v-for 同时用在同一个元素上。

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

1.为了过滤一个列表中的项目 (比如 v-for=“user in users” v-if=“user.isActive”)。在这种情形下,请将 users 替换为一个计算属性 (比如 activeUsers),让其返回过滤后的列表。

2.为了避免渲染本应该被隐藏的列表 (比如 v-for=“user in users” v-if=“shouldShowUsers”)。这种情形下,请将v-if 移动至容器元素上(比如 ul、ol)。

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

Vue 3中,同时使用v-ifv-for时,由于v-if比v-for优先级更高,v-if的条件无法访问v-for作用域内定义的变量别名,所以官网不推荐二者同时使用。不过,仍有一些可行的方法: - **在v-for修饰元素的子元素上使用v-if**:避免v-forv-if同时作用在一个元素上,可在v-for修饰元素的子元素上使用v-if。 ```html <template> <div v-for="item in items" :key="item.id"> <span v-if="item.shouldShow">{{ item.name }}</span> </div> </template> ``` - **将v-if改为v-show**:把v-if改为v-show,这样二者可作用在同一个元素上。v-show只是基于条件来切换元素的CSS display属性,而不是像v-if那样销毁重新创建元素。 ```html <template> <div v-for="item in items" :key="item.id" v-show="item.shouldShow"> {{ item.name }} </div> </template> ``` - **使用template作为v-for的渲染模板**:使用template标签进行v-for渲染,再在内部元素使用v-if。 ```html <template> <template v-for="(item, index) in lists" :key="'item-' + item.key"> <li class="list-group-item" v-if="!item.checked"> <div class="checkbox" @click="() => { item.checked = !item.checked }"> <input type="checkbox" class="form-check-input" :id="'item-' + index" v-model="item.checked" /> <label> {{ item.name }} </label> </div> </li> </template> </template> ``` - **将v-if放到循环列表元素的父元素中或使用template包裹**:避免在同一元素上使用,可将v-if放到父元素或用template包裹v-for渲染的元素,再在template上使用v-if。 ```html <template> <template v-if="isExpired === 1"> <div v-for="item in inHouseList" :key="item.id">{{ item.bar_code }}</div> </template> </template> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值