当前位置: 首页 > news >正文

【VUE】v-if和v-for的优先级

v-if和v-for

  • v-if 用来显示和隐藏元素
    flag为true时,dom元素会被删除达到隐藏效果
    <div class="boxIf" v-if="flag"></div>
  • v-for用来进行遍历,可以遍历数字对象数组,会将整个元素遍历指定次数
<!--    遍历数字--><div v-for="num in 5" :key="num">{{ num }}</div>
<!--    遍历对象--><div v-for="(value,key) in obj" :key="key">{{value}}</div>
<!--    遍历数组--><div v-for="(item,index) in list" :key="index">{{item}}</div>

如果将遍历元素v-for和删除元素v-if连用,会发生什么?

v-if和v-for的优先级

首先,在vue官网中是不建议v-for和v-if连用
在这里插入图片描述

  • 在Vue 2中,v-for的优先级比v-if高,因此在连用的时候会先进行v-for将所有元素渲染到页面上之后,再进行v-if判断删除元素,这样会导致性能的浪费(每次先渲染元素再进行判断删除)
    官网上给了一个例子,可以简单理解一下。在这个例子中会先将用户进行遍历渲染(v-for),再去判断用户是否为活跃用于(v-if)。在这里只需要活跃用户渲染,但是由于v-for的优先级更高,因此无论是否为活跃用户都会渲染,这样会造成资源的浪费。
<ul><liv-for="user in users"v-if="user.isActive":key="user.id">{{ user.name }}</li>
</ul>
  • 在Vue 3中,v-if的优先级比v-for高
    看看官网上给的例子,给一个用户列表,遍历活跃用户(user.isActive为true)。
<ul><liv-for="user in users"v-if="user.isActive":key="user.id">{{ user.name }}</li>
</ul>

Will throw an error, because the v-if directive will be evaluated first and the iteration variable user does not exist at this moment.(将抛出一个错误,因为v-if指令将首先求值,并且迭代变量user此时不存在。)

由官网给的解释可以看出,直接将v-if和v-for连用可能会出现报错,因此不建议在同一节点中连用

解决方案

vue2提供的解决方案

1.添加一个属性。将 users 替换为一个计算属性 (比如 activeUsers),让其返回过滤后的列表。
2.将 v-if 移动至外层容器元素上。

activeUsers过滤出满足条件的用户,将遍历的users改为activeUsers

computed: {activeUsers: function () {return this.users.filter(function (user) {return user.isActive})}
}
<ul><liv-for="user in activeUsers":key="user.id">{{ user.name }}</li>
</ul>

或者使用嵌套关系,将v-if添加到外层元素上。先判断是否要展示用户信息,满足条件再进行渲染。

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

Vue2风格指南相关部分

Vue3提供的解决方案

1.添加一个属性。将 users 替换为一个计算属性 (比如 activeUsers),让其返回过滤后的列表。(与Vue2相同)
2.将 v-for移动至外层容器元素上。

第一个方法与vue2相同,不过多进行解释。
第二个方法:嵌套。与vue2不同的是,在vue3中,将v-for移动至外层的元素上

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

Vue3风格指南相关部分

总结

在Vue2中,v-for的优先级更高。在Vue3中,v-if的优先级更高。
无论哪个优先级更高,都不建议在同一节点连用v-if和v-for。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Perl与数据库交互:深入理解DBI模块
  • centos(或openEuler系统)安装clickhouse集群
  • MySQL 关键字 IN 与 EXISTS 的使用与区别
  • 前端书籍翻页效果
  • 【proteus经典实战】定时器控制交通灯指示灯
  • Eureka: 微服务架构中的服务发现与注册实践
  • Python 潮流周刊#61:PyPI 管理员密钥泄露事件(摘要)
  • 【面试题】手撕缓存LRU
  • 开放开源开先河(三)
  • python需要掌握那些语法
  • 【Mysql关于读已提交和可重复读(Read Committed)隔离级别下解决幻读的方案】
  • python--实验15 数据分析与可视化
  • Python爬虫——1爬虫基础(一步一步慢慢来)
  • 【golang-ent】go-zero框架 整合 ent orm框架 | 解决left join未关联报错的问题
  • window11 部署llama.cpp并运行Qwen2-0.5B-Instruct-GGUF
  • 30秒的PHP代码片段(1)数组 - Array
  • Android优雅地处理按钮重复点击
  • CSS 提示工具(Tooltip)
  • JS笔记四:作用域、变量(函数)提升
  • Linux CTF 逆向入门
  • Mocha测试初探
  • nginx 配置多 域名 + 多 https
  • Vue2.0 实现互斥
  • 闭包--闭包作用之保存(一)
  • 码农张的Bug人生 - 初来乍到
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 使用 @font-face
  • 使用putty远程连接linux
  • 突破自己的技术思维
  • 一起参Ember.js讨论、问答社区。
  • 用element的upload组件实现多图片上传和压缩
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #NOIP 2014#Day.2 T3 解方程
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二)Linux——Linux常用指令
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (五)MySQL的备份及恢复
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)nsfocus-绿盟科技笔试题目
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .net Signalr 使用笔记
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .net6 webapi log4net完整配置使用流程
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net6+aspose.words导出word并转pdf
  • .NET处理HTTP请求
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • .sh 的运行