请你说一下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.mzph.cn/news/164977.shtml

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

相关文章

RubyMine 2023:提升Rails/Ruby开发效率的强大利器

在Rails/Ruby开发领域&#xff0c;JetBrains RubyMine一直以其强大的功能和优秀的性能而备受开发者的青睐。现如今&#xff0c;我们迎来了全新的RubyMine 2023版本&#xff0c;它将为开发者们带来更高效的开发体验和无可比拟的工具支持。 首先&#xff0c;RubyMine 2023提供了…

Java-使用poi-tl根据word模板动态生成word

作者wangsz&#xff0c;想写一些关于word的工具&#xff0c;所以就写了这篇文章 1.首先&#xff0c;先导入所需要的依赖&#xff08;poi相关依赖即可&#xff09; <!-- POI --><dependency><groupId>org.apache.poi</groupId><artifactId>poi&l…

【libGDX】使用Mesh绘制立方体

1 前言 本文主要介绍使用 Mesh 绘制立方体&#xff0c;读者如果对 Mesh 不太熟悉&#xff0c;请回顾以下内容&#xff1a; 使用Mesh绘制三角形使用Mesh绘制矩形使用Mesh绘制圆形 在绘制立方体的过程中&#xff0c;主要用到了 MVP &#xff08;Model View Projection&#xff0…

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】计算机视觉(最终篇)

目录 知识储备 KITTI数据集 1.KITTI数据集概述 2.数据采集平台 3.Dataset详述 算法原理

GIT无效的源路径/URL

ssh-add /Users/haijunyan/.ssh/id_rsa ssh-add -K /Users/haijunyan/.ssh/id_rsa

windows11上enable WSL

Windows电脑上要配置linux&#xff08;这里指ubuntu&#xff09;开发环境&#xff0c;主要有三种方式&#xff1a; 1&#xff09;在windows上装个虚拟机&#xff08;比如vmware&#xff09;。缺点是vmware加载ubuntu后系统会变慢很多&#xff0c;而且需要通过samba来实现window…

git clone -mirror 和 git clone 的区别

目录 前言两则区别git clone --mirrorgit clone 获取到的文件有什么不同瘦身仓库如何选择结语开源项目 前言 Git是一款强大的版本控制系统&#xff0c;通过Git可以方便地管理代码的版本和协作开发。在使用Git时&#xff0c;常见的操作之一就是通过git clone命令将远程仓库克隆…

【vue2】axios请求与axios拦截器的使用详解

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;当我们在路由跳转前与后我们可实现触发的操作 【前言】ajax是一种在javaScript代码中发请…

低代码开发与IT开发的区别

目录 一、含义不同 二、开发门槛不同 三、两者之间的区别 1、从技术特征来看 2、从目标开发者来看 四、低代码平台使用感受&#xff1f; &#xff08;1&#xff09;自定义模块&#xff0c;满足不同的业务需求 &#xff08;2&#xff09;工作流引擎&#xff0c;简化复杂流程的管…

机器学习实战-第4章 基于概率论的分类方法: 朴素贝叶斯

朴素贝叶斯 概述 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。本章首先介绍贝叶斯分类算法的基础——贝叶斯定理。最后,我们通过实例来讨论贝叶斯分类的中最简单的一种: 朴素贝叶斯分类。 贝叶斯理论 & 条件概率 贝叶斯理论 …

linux网络之网络层与数据链路层

文章目录 一、网络层 1.IP协议 2.IP协议头格式 3.网段划分 4.特殊ip地址 5.IP地址的数量限制 6.私有ip和公网IP 7.路由 二、数据链路层 1.以太网 2.以太网帧格式 3.MAC地址 4.对比理解MAC地址和IP地址 5.MTU 6.ARP协议 ARP协议的工作流程 ARP数据报的格式 7.DNS 8.ICMP协议 9.N…

839 - Not so Mobile (UVA)

题目链接如下&#xff1a; Online Judge 这道题刘汝佳的解法极其简洁&#xff0c;用了20来行就解决了问题。膜拜…… 他的解法如下&#xff1a;天平&#xff08;UVa839紫书p157&#xff09;_天平 uva 839_falldeep的博客-CSDN博客 我写了两个&#xff08;都很冗长&#xff…

浅谈电气设备的绝缘在线监测与状态维修探究

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;在线监测是控制好电气设备绝缘的重要方式&#xff0c;为电力系统稳定奠定重要基础。在线监测电气设备时&#xff0c;要利用检测技术促进电力系统运行效率提升&#xff0c;让电气设备在具体工作过程中发挥更大作…

升级jdk17过程中,原来的jdk8下的webservice客户端怎样处理

背景&#xff1a;之前jdk8环境下&#xff0c;使用的cxf框架&#xff0c;而且是动态加载解析作为客户端。大家一直相处的很愉快。但是最近升级jdk17&#xff0c;发现cxf不好用了。网上百度&#xff0c;大部分都是说升级cxf版本&#xff0c;并且添加jaxb的相关依赖就可以了。但是…

在线接口测试工具fastmock使用

1、fastmock线上数据模拟器 在平时的项目测试中&#xff0c;尤其是前后端分离的时候&#xff0c;前端人员需要测试调用后端的接口&#xff0c;这个时候会出现测试不方便的情况。此时我们可以使用fastmock平台在线上模拟出一个可以调用的接口&#xff0c;方便前端人员进行数据测…

C/C++---------------LeetCode第2540. 最小公共值

最小公共值 题目及要求哈希算法双指针 题目及要求 给你两个整数数组 nums1 和 nums2 &#xff0c;它们已经按非降序排序&#xff0c;请你返回两个数组的 最小公共整数 。如果两个数组 nums1 和 nums2 没有公共整数&#xff0c;请你返回 -1 。 如果一个整数在两个数组中都 至少…

categraf托管与自升级

categraf支持多种方式进行部署、托管&#xff0c;社区里部署和管理categraf也是五花八门&#xff0c;大家自己使用方便即可。 之前我们觉得大家通过ansible之类的工具批量下发/更新就能很简单地完成任务&#xff0c;最近很多用户咨询我们关于categraf有没有更方便的升级方式&am…

flink和机器学习模型的常用组合方式

背景 flink是一个低延迟高吞吐的系统&#xff0c;每秒处理的数据量高达数百万&#xff0c;而机器模型一般比较笨重&#xff0c;虽然功能强大&#xff0c;但是qps一般都比较低&#xff0c;日常工作中&#xff0c;我们一般是如何把flink和机器学习模型组合起来一起使用呢? fli…

数据结构与算法【B树】的Java实现+图解

目录 B树 特性 实现 节点准备 大体框架 实现分裂 实现新增 实现删除 完整代码 B树 也是一种自平衡的树形数据结构&#xff0c;主要用于管理磁盘上的数据管理&#xff08;减少磁盘IO次数&#xff09;。而之前说的AVL树与红黑树适合用于内存数据管理。存储一个100w的数…

python每日一题——2字母异位词分组

题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“nat”…