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

news2024/9/22 21:22:20
  • 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.coloradmin.cn/o/1244783.html

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

相关文章

二叉树的顺序结构及实现

目录 1 二叉树的顺序结构2. 堆的概念及结构3 .堆的实现(小堆) 1 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储&#xff0c;…

windows11上enable WSL

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

基于DCT变换的图像压缩解压缩算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、DCT变换原理 4.2、基于DCT的图像压缩 4.3、基于DCT的图像解压缩 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ...................…

消息中间件——RabbitMQ(六)理解Exchange交换机核心概念!

前言 来了解RabbitMQ一个重要的概念&#xff1a;Exchange交换机 1. Exchange概念 Exchange&#xff1a;接收消息&#xff0c;并根据路由键转发消息所绑定的队列。 蓝色框&#xff1a;客户端发送消息至交换机&#xff0c;通过路由键路由至指定的队列。 黄色框&#xff1a;交换…

案例022:基于微信小程序的行政复议在线预约系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

微信小程序实现【点击 滑动 评分 评星(5星)】功能

wxml文件&#xff1a; <view class"wxpl_xing"><view class"manyidu">{{scoreContent}}</view><view><block wx:for{{scoreArray}} wx:for-item"item"><view classstarLen bindtapchangeScore data-sy"{{…

微机原理_2

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案&#xff0c;请将选定的答案填涂在答题纸的相应位置上。&#xff09; 下列数中最大的数为&#xff08;&#xff09; A. 10010101B B. (126)8 C. 96H D. 100 CPU 执行 OUT 60H,…

【Java 进阶篇】Redis 命令操作:轻松掌握基本操作

Redis是一款高性能的键值对存储系统&#xff0c;以其快速、灵活的特性而备受开发者推崇。本文将详细介绍Redis的基本命令操作&#xff0c;包括键值操作、数据查询、事务处理等方面&#xff0c;帮助初学者更好地理解和使用Redis。 基本命令 1. 键值操作 1.1 SET&#xff1a;设…

Redis的性能,哨兵模式,集群,

Redis的性能管理; redis的数据保存在内存中 redis-cli info memory redis内存使用info memory命令参数解析 used_memory:236026888 由 Redis 分配器分配的内存总量&#xff0c;包含了redis进程内部的开销和数据占用的内存&#xff0c;以字节&#xff08;byte&#xff09…

CentOS虚拟机重置账号密码

虚拟机忘记密码了 一般来说&#xff0c;虚拟机的账号密码&#xff0c;工作中都会有文档记录&#xff0c;如果忘记了可以查看文档。但是也有特例&#xff0c;虚拟机的密码没有记录到文档中&#xff0c;尝试了很多次依然登录失败&#xff0c;这时候就只能重置账号密码了。 1.重…

61 权限提升-RedisPostgre令牌窃取进程注入

目录 演示案例:Redis数据库权限提升-计划任务PostgreSQL数据库权限提升Windows2008&7令牌窃取提升-本地Windows2003&10进程注入提升-本地pinjector进程注入工具针对-win2008以前操作系统pexec64 32进程注入工具针对-win2008及后操作系统- (佛系) 涉及资源: postgersql是…

配置华为云镜像加速器

登录华为云官网&#xff0c;点击控制台 在服务列表里面寻找swr服务 点击镜像中心&#xff0c;点击镜像加速器 {"registry-mirrors": [ "https://301dc05233c6419b810bdb22135af9eb.mirror.swr.myhuaweicloud.com" ]}配置镜像加速器 vim /etc/docker…

数据提取PDF SDK的对比推荐

PDF 已迅速成为跨各种平台共享和分发文档的首选格式&#xff0c;它作为一种数据来源&#xff0c;常见于公司的各种报告和报表中。为了能更好地分析、处理这些数据信息&#xff0c;我们需要检测和提取 PDF 中的数据&#xff0c;并将其转换为可用且有意义的格式。而数据提取的 PD…

基于Python实现汽车销售数据可视化+预测【500010086.1】

导入模块 import numpy as np import pandas as pd from pylab import mpl import plotly.express as px import matplotlib.pyplot as plt import seaborn as sns设置全局字体 plt.rcParams[font.sans-serif][kaiti]获取数据 total_sales_df pd.read_excel(r"./data/中…

【Web题】狼追兔问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

CSS特效017:球体涨水的效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

基于遗传优化的多属性判决5G-Wifi网络切换算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 .......................................................................... %接收功率、网…

Python中match-case语法: 引领新的模式匹配时代

更多Python学习内容&#xff1a;ipengtao.com Python在其最新的版本中引入了match-case语法&#xff0c;这是一项强大的功能&#xff0c;为开发者提供了更加灵活和直观的模式匹配方式。本文将深入探讨match-case的各个方面&#xff0c;并通过丰富的示例代码&#xff0c;帮助大家…

MES管理系统与自动化系统如何实现相辅相成

随着科技的飞速发展&#xff0c;制造企业正面临着数字化转型的巨大挑战与机遇。在这一过程中&#xff0c;自动化系统无疑扮演了重要角色&#xff0c;然而&#xff0c;仅仅依赖自动化系统还不足以支撑起整个数字化转型的大厦。这就是为什么我们需要推行MES管理系统解决方案的原因…

【数字信号处理】傅里叶变换的离散性与周期性

傅里叶变换的离散性与周期性 2023年11月21日 #elecEngeneer 文章目录 傅里叶变换的离散性与周期性1. 符号说明2. 具体分析3. 序列的序号表示的DFT下链 1. 符号说明 t : 连续时间(时域)变量 ω : 频域变量&#xff0c;aka角频率 g : 时域函数 G : 频域函数 n : 时域采样序列序号…