请你说一下Vue中v-if和v-for的优先级谁更高

  • v-if 与 v-for简介
    • v-if
    • v-for
    • v-if & v-for使用
  • v-if 与 v-for优先级比较
    • vue2 中,v-for的优先级高于v-if
      • 例子进行分析
    • vue3 v-if 具有比 v-for 更高的优先级
      • 例子进行分析
  • 总结
    • 在vue2中,v-for的优先级高于v-if
    • 在vue3中,v-if的优先级高于v-for

咋一听到这个题,如果自己没有试验过感觉还真容易说错,就像是会进入一个“思维误区”

就会理所当然的想如果这两个指令同时出现一个标签那是不是应该先if判断是否存在才会去渲染for的循环结构?

但实际是这样吗?

v-if 与 v-for简介

v-if

v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 true值的时候被渲染。

v-if是Vue.js中的一个指令,用于条件渲染,根据绑定的表达式的值的真假情况来决定是否显示或隐藏元素。

当v-if的表达式值为true时,元素会被渲染出来;当v-if的表达式值为false时,元素不会被渲染出来。

例如,下面代码中,如果isShow为true,则div元素将会被渲染,否则不会被渲染:

<template><div v-if="isShow">show content</div>
</template>

需要注意的是,v-if指令会根据表达式的值动态地添加或删除元素,因此如果有频繁的切换操作,会影响性能。

此时可以考虑使用v-show指令,它只是简单地控制元素的显示或隐藏,并没有频繁的添加或删除元素。

v-for

v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组或者对象,而 item 则是被迭代的数组元素的别名。

v-for使用 的时候,建议设置key值,并且保证每个key值是独一无二的,这便于diff算法进行优化。

v-for是Vue.js中的一个指令,用于循环渲染数组或对象的数据。

v-for的用法有两种情况:

  1. 遍历数组:
    可以通过v-for指令循环渲染一个数组,将数组中的每个元素渲染成对应的元素或组件。语法形式为:v-for="item in array"

例如,下面代码中使用v-for指令循环渲染一个数组list中的每个元素:

<template><div><ul><li v-for="item in list" :key="item.id">{{ item.name }}</li></ul></div>
</template><script>
export default {data() {return {list: [{ id: 1, name: 'Apple' },{ id: 2, name: 'Banana' },{ id: 3, name: 'Orange' }]};}
}
</script>
  1. 遍历对象:
    可以通过v-for指令循环渲染一个对象的属性,将对象的属性和值渲染成对应的元素或组件。语法形式为:v-for="value, key in object"

例如,下面代码中使用v-for指令循环渲染一个对象info的每个属性:

<template><div><ul><li v-for="(value, key) in info" :key="key">{{ key }}: {{ value }}</li></ul></div>
</template><script>
export default {data() {return {info: {name: 'John',age: 25,gender: 'Male'}};}
}
</script>

需要注意的是,在使用v-for时,需要为每个循环的元素或组件添加唯一的key属性,以便Vue.js能够跟踪每个节点的身份,并且在更新时进行高效的DOM操作。

更多详细内容,请微信搜索“前端爱好者戳我 查看

v-if & v-for使用

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

v-if 与 v-for优先级比较

  • 在vue2中,v-for的优先级高于v-if
  • 在vue3中,v-if的优先级高于v-for(Vue 3.0 已经调整了v-if和v-for 的优先级,故不存在渲染性能问题。)

vue2 中,v-for的优先级高于v-if

当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级。

官方文档:https://v2.cn.vuejs.org/v2/guide/conditional.html#v-if-%E4%B8%8E-v-for-%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8

在 Vue 2 中,不推荐在同一个元素上同时使用 v-if 和 v-for,主要是由于可能引发的性能问题和逻辑混淆。当 v-if 和 v-for 结合使用时,会导致以下问题:

  1. 性能问题: 当 v-if 和 v-for 同时存在于同一个元素上时,Vue 会在每次循环迭代时都重新渲染和销毁元素。这可能会导致不必要的 DOM 更新和性能下降,特别是在较长的列表上。这是因为每次循环迭代都会重新计算条件,并进行 DOM 操作。

  2. 逻辑混淆: 同时使用 v-if 和 v-for 会增加代码的复杂性和理解难度。将条件和循环逻辑分离可以使代码更加清晰,并让开发人员更容易理解和维护。

例子进行分析
<template><div class="test-container"><div v-for="(item,index) in list" v-if="item === 9" :key="item" ></div></div>
</template>
<script>export default {data(){return {numberArr:[1,2,3,4,5,6,7,8,9,10]}}};
</script>
<style scoped>
</style>

但是本段代码实际的逻辑为

this.numberArr.map(function (item,index) {if (item===9) {return item}
})

相反,最佳实践是:

将条件渲染 (v-if) 和列表渲染 (v-for) 分开处理。
可以使用计算属性或方法来处理数据,然后在模板中分别使用 v-if 和 v-for。

以下是一个示例代码:

<template><div><div v-if="showDiv" v-for="item in filteredItems" :key="item.id">{{ item.name }}</div></div>
</template><script>
export default {data() {return {showDiv: true,items: [{ id: 1, name: 'Item 1', isActive: true },{ id: 2, name: 'Item 2', isActive: false },{ id: 3, name: 'Item 3', isActive: true }]}},computed: {filteredItems() {return this.items.filter(item => item.isActive);}}
}
</script> 

在上述示例中,我们使用了计算属性 filteredItems 来过滤具有 isActive 属性的项目。

然后,我们在模板中使用 v-for 来渲染过滤后的结果,并使用 v-if 来条件性地渲染每个元素。这样可以保持逻辑的清晰和性能的优化。

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

当 v-if 与 v-for 一起使用时,v-if 具有比 v-for 更高的优先级。

官方文档:https://cn.vuejs.org/guide/essentials/list.html#v-for-with-v-if

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

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

<template v-for="todo in todos"><li v-if="!todo.isComplete">{{ todo.name }}</li>
</template>
例子进行分析
<template><div class="test-container"><div v-for="(item,index) in numberArr" v-if="item === 9" :key="item"></div></div>
</template>
<script>
export default {data(){return {numberArr: [1,2,3,4,5,6,7,8,9,10]   //需要遍历的数据}}
};
</script>
<style scoped>
</style> 

由于 v-if 优先级高,导致页面并没有进行渲染,控制台报错。

以下为控制台报错信息

[Vue warn]: Property "index" was accessed during render but is not defined on instance.

但是下面这种用法控制台并不会报错但是会警告

<template><div class="test-container"><ul><li v-for="(item, index) in objList" :key="index" v-if="item.isShow">{{ item.name }}</li></ul></div>
</template>
<script>export default {data(){return {objList:[{ name: 'obj2', isShow: false },{ name: 'obj2', isShow: true },]}}};
</script>
<style scoped>
</style> 

但是这种写法也会有一个问题,无论是否符合v-if的条件都进行了报错

官方推荐的写法是这样的, 把 v-for 移动到容器元素上,例如ul,ol 或者外面包裹一层 template

<template><div class="test-container"><ul><template v-for="(item, index) in objList" :key="index"><li v-if="item.isShow">{{ item.name }}</li></template></ul></div>
</template>
<script>export default {data(){return {objList:[{ name: 'obj2', isShow: false },{ name: 'obj2', isShow: true },]}}};
</script>
<style scoped>
</style>

但如果想要有条件地跳过循环的执行,那么可以将v-if置于外层元素或者template上。

例如这样:

<template><div class="test-container"><ul v-if="objList.length"><li v-for="(item, index) in objList" :key="index">{{ item.name }}</li></ul></div>
</template>
<script>
export default {data(){return {objList:[{ name: 'obj2', isShow: false },{ name: 'obj2', isShow: true },]}}
};
</script>
<style scoped>
</style>

总结

在vue2中,v-for的优先级高于v-if

Vue 会在每次循环迭代时都重新渲染和销毁元素。

v-for比v-if优先级更高(可以说清结论的来源更好)。

如果同时出现在同一个标签上,则每次渲染都会先执行循环再进行条件判断,会造成较大的性能浪费。

解决办法有两种:

  • 先在外层套一个template来放置v-if,再嵌套v-for。
  • 借助computed计算属性代替v-if。

在vue3中,v-if的优先级高于v-for

注:Vue 3.0 已经调整了v-if和v-for 的优先级,故不存在渲染性能问题。

参考文档

  • https://www.nowcoder.com/discuss/513503986318696448
  • https://baijiahao.baidu.com/s?id=1766197354040903874&wfr=spider&for=pc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/212634.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加速软件开发:自动化测试在持续集成中的重要作用!

持续集成的自动化测试 如今互联网软件的开发、测试和发布&#xff0c;已经形成了一套非常标准的流程&#xff0c;最重要的组成部分就是持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff0c;目前主要的持续集成系统是Jenkins&#xff09;。 那么什么是持…

linux高级篇基础理论六(firewalld,防火墙类型,,区域,服务端口,富语言)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

11.docker的网络-docker0的理解及bridge网桥模式的介绍与实例

1.docker0的基本理解 安装完docker服务后&#xff0c;我们首先查看一下宿主机的网络配置 ifconfig我们可以看到&#xff0c;docker服务会默认在宿主机上创建一个虚拟网桥docker0&#xff0c;该网桥网络的名字称为docker0。它在内核层连通了其他物理或者虚拟网卡&#xff0c;这…

【JavaSE】基础笔记 - 异常(Exception)

目录 1、异常的概念和体系结构 1.1、异常的概念 1.2、 异常的体系结构 1.3 异常的分类 2、异常的处理 2.1、防御式编程 2.2、异常的抛出 2.3、异常的捕获 2.3.1、异常声明throws 2.3.2、try-catch捕获并处理 3、自定义异常类 1、异常的概念和体系结构 1.1、异常的…

Vue3中如何响应式解构 props

目录 1&#xff0c;前言2&#xff0c;解决2.1&#xff0c;利用插件&#xff0c;实现编译时转换2.2&#xff0c;toRef 和 toRefs 1&#xff0c;前言 Vue3 中为了保持响应性&#xff0c;始终需要以 props.x 的方式访问这些 prop。这意味着不能够解构 defineProps 的返回值&#…

新王加冕,GPT-4V 屠榜视觉问答

当前&#xff0c;多模态大型模型&#xff08;Multi-modal Large Language Model, MLLM&#xff09;在视觉问答&#xff08;VQA&#xff09;领域展现了卓越的能力。然而&#xff0c;真正的挑战在于知识密集型 VQA 任务&#xff0c;这要求不仅要识别视觉元素&#xff0c;还需要结…

python之TCP的网络应用程序开发

文章目录 版权声明python3编码转换socket类的使用创建Socket对象Socket对象常用方法和参数使用示例服务器端代码客户端代码 TCP客户端程序开发流程TCP服务端程序开发流程TCP网络应用程序注意点socket之send和recv原理剖析send原理剖析recv原理剖析send和recv原理剖析图 多任务版…

基于单片机的光伏发电并网系统设计(论文+源码)

1.系统设计 片作为主控制器。由于太阳能板本身的能量输出受到负载影响&#xff0c;因此需要在太阳能板后面加入一级DC/DC电路&#xff0c;来实现最大功率跟踪&#xff0c;以提高整个系统的效率。接着&#xff0c;由于光伏逆变器需要产生220V的交流电给居民使用&#xff0c;因此…

iOS APP包分析工具 | 京东云技术团队

介绍 分享一款用于分析iOSipa包的脚本工具&#xff0c;使用此工具可以自动扫描发现可修复的包体积问题&#xff0c;同时可以生成包体积数据用于查看。这块工具我们团队内部已经使用很长一段时间&#xff0c;希望可以帮助到更多的开发同学更加效率的优化包体积问题。 工具下载…

EMG肌肉电信号处理合集(二)

本文主要展示常见的肌电信号特征的提取说明。使用python 环境下的Pysiology计算库。 目录 1 肌电信号第一次burst的振幅&#xff0c; getAFP 函数 2 肌电信号波长的标准差计算&#xff0c;getDASDV函数 3 肌电信号功率谱频率比例&#xff0c;getFR函数 4 肌电信号直方图…

深信服AF设置安全防护策略

以百度为例&#xff0c;禁止内网用户访问www.baidu.com 1、对象→安全策略模板→新增 2、名称自定义&#xff0c;安全配置只选择url过滤 3、点击图标→新增→设置名称及url 勾选刚刚新增的url--deny→确定 4、高级选项→确定 5、策略→安全策略→安全防护策略→新增用户防护策略…

宿主Linux——KVM安装Windows7系统

KVM虚拟技术 KVM(Kernel-based Virtual Machine) 是基于Linux内核的开源虚拟化技术&#xff0c;在一台物理机上可同时运行多个虚拟系统。KVM使用硬件虚拟化扩展&#xff0c;例如Intel的VT和AMD的AMD-V&#xff0c;在性能方面更加高效&#xff0c;可提供更好的计算能力和响应速…