Skip to main content

问题-v-if和v-for-前者优先级更高

vue3:v-if 比 v-for 的优先级更高

当它们同时存在于一个节点上时,v-if 比 v-for 的优先级更高。这意味着 v-if 的条件将无法访问到 v-for 作用域内定义的变量别名:

<!--
这会抛出一个错误,因为属性 todo 此时
没有在该实例上定义
-->
<li v-for="todo in todos" v-if="!todo.isComplete">
{{ todo.name }}
</li>

解决方案

在外新包装一层<template>再在其上使用 v-for 可以解决这个问题 (这也更加明显易读):

<template v-for="todo in todos">
<li v-if="!todo.isComplete">
{{ todo.name }}
</li>
</template>

vue2中:v-for比v-if优先,即每一次都需要遍历整个数组,影响速度:

<div
v-for="(fileMsg,index) in fileMsgList"
:key="fileMsg.id"
v-if="index < 2"
>
<sys-file-layout :fileMsg="fileMsg"></sys-file-layout>
</div>

想要循环生成一系列组件块,但是不希望生成序号1之后的内容,同时用了v-if和v-for,那么,还是会根据整个数组生成所有组件块,之后才判断v-if让多余的小时,非常耗资源。

第一种:解决方案:如果 v-if 和 v-for 只能放在同一级标签中,使用计算属性进行改造:

1、必要情况下应该替换成computed属性:

computed: {
fileMsgListCom() {
return this.fileMsgList.filter((item, index) => {
return item < 2;
});
}
}

<div
class="file_name"
v-for="(fileMsg,index) in fileMsgListCom"
:key="fileMsg.id"
>
<sys-file-layout :fileMsg="fileMsg"></sys-file-layout>
</div>

第二种:

根据 eslint 指出的方法进行改进: 将 v-if 和 v-for 分别放在不同标签中

<ul v-if="active">
<li v-for="item in list" :key="item.id">
{{ item.title }}
</li>
</ul>

关于赋值

vue2 下,this 可以理解成一个大对象,所以怎么修改值都不会切断引用,保持响应性。 vue3 赋值要保持响应,就不要改变引用,否则无法被 proxy 监听