v-if 和 v-for 为什么不建议一起用?(看完秒懂不纠结)-程序员宅基地

技术标签: 前端框架  前端  es6  vue.js  小程序  javascript  jquery  

在这里插入图片描述



一、作用

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

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

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

两者在用法上

<Modal v-if="isShow" />

<li v-for="item in items" :key="item.id">
    {
    {
     item.label }}
</li>

二、优先级

v-ifv-for都是vue模板系统中的指令

vue模板编译的时候,会将指令系统转化成可执行的render函数

示例

编写一个p标签,同时使用v-ifv-for

<div id="app">
    <p v-if="isShow" v-for="item in items">
        {
    {
     item.title }}
    </p>
</div>

创建vue实例,存放isShowitems数据

const app = new Vue({
    
  el: "#app",
  data() {
    
    return {
    
      items: [
        {
     title: "foo" },
        {
     title: "baz" }]
    }
  },
  computed: {
    
    isShow() {
    
      return this.items && this.items.length > 0
    }
  }
})

模板指令的代码都会生成在render函数中,通过app.$options.render就能得到渲染函数

ƒ anonymous() {
    
  with (this) {
     return 
    _c('div', {
     attrs: {
     "id": "app" } }, 
    _l((items), function (item) 
    {
     return (isShow) ? _c('p', [_v("\n" + _s(item.title) + "\n")]) : _e() }), 0) }
}

_lvue的列表渲染函数,函数内部都会进行一次if判断

初步得到结论:v-for优先级是比v-if

再将v-forv-if置于不同标签

<div id="app">
    <template v-if="isShow">
        <p v-for="item in items">{
    {
    item.title}}</p>
    </template>
</div>

再输出下render函数

ƒ anonymous() {
    
  with(this){
    return 
    _c('div',{
    attrs:{
    "id":"app"}},
    [(isShow)?[_v("\n"),
    _l((items),function(item){
    return _c('p',[_v(_s(item.title))])})]:_e()],2)}
}

这时候我们可以看到,v-forv-if作用在不同标签时候,是先进行判断,再进行列表的渲染

我们再在查看下vue源码

源码位置:\vue-dev\src\compiler\codegen\index.js

export function genElement (el: ASTElement, state: CodegenState): string {
    
  if (el.parent) {
    
    el.pre = el.pre || el.parent.pre
  }
  if (el.staticRoot && !el.staticProcessed) {
    
    return genStatic(el, state)
  } else if (el.once && !el.onceProcessed) {
    
    return genOnce(el, state)
  } else if (el.for && !el.forProcessed) {
    
    return genFor(el, state)
  } else if (el.if && !el.ifProcessed) {
    
    return genIf(el, state)
  } else if (el.tag === 'template' && !el.slotTarget && !state.pre) {
    
    return genChildren(el, state) || 'void 0'
  } else if (el.tag === 'slot') {
    
    return genSlot(el, state)
  } else {
    
    // component or element
    ...
}

在进行if判断的时候,v-for是比v-if先进行判断

最终结论:v-for优先级比v-if


三、注意事项

  • 永远不要把 v-ifv-for 同时用在同一个元素上,带来性能方面的浪费(每次渲染都会先循环再进行条件判断)

  • 如果避免出现这种情况,则在外层嵌套template(页面渲染不生成dom节点),在这一层进行v-if判断,然后在内部进行v-for循环

<template v-if="isShow">
    <p v-for="item in items">
</template>
  • 如果条件出现在循环内部,可通过计算属性computed提前过滤掉那些不需要显示的项
computed: {
    
    items: function() {
    
      return this.list.filter(function (item) {
    
        return item.isShow
      })
    }
}

希望本文能够对您有所帮助!如果您有任何问题或建议,请随时在评论区留言联系 章挨踢(章IT)
谢谢阅读!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_69422396/article/details/135217505

智能推荐

Android自定义配置_android 自定义配置参数-程序员宅基地

文章浏览阅读511次。Android自定义配置文章目录Android自定义配置屏幕不休眠开机显示自定义静态LOGO系统中文显示隐藏状态栏电量开机不显示No SIM card 提示隐藏状态栏和三大按键1. 默认配置文件2. 加载配置文件隐藏搜索栏1. 在布局文件中删除2. 在launcher中去掉关闭系统休眠Launcher图标清空直接隐藏清空布局默认开启以太网添加全局变量Settings.Global字符串定义默认值数据库加载使用开启默认配置测试备注屏幕不休眠# 获取屏幕休眠时间adb shell settings ge_android 自定义配置参数

RAID 介绍(含有硬件RAID卡)-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏7次。其中,--level=5指定RAID级别为5,--raid-devices=3指定使用3块磁盘驱动器,后面的/dev/sdb、/dev/sdc、/dev/sdd是要组成RAID 5阵列的磁盘驱动器设备名称。数据保护和冗余:RAID卡支持不同的RAID级别,如RAID 0、RAID 1、RAID 5等,提供数据冗余和容错能力,以保护数据免受磁盘故障的影响。硬件加速:由于RAID卡具有自己的处理器和内存,它可以在硬件级别上执行RAID操作,减轻了主机CPU和内存的负担,从而提供更高的效率和吞吐量。_raid卡

xml文件中特殊字符的转义_xml特殊字符转义-程序员宅基地

文章浏览阅读5.3k次。前言在做项目的过程中,将项目中的数据库由原来链接我本地的数据库改为链接服务器的数据库,但是发现修改之后项目启动一直失败,经过查看日志才发现,原来数据库密码解析有问题。因为数据库的密码包含特殊符号,所以解析失败了。解决方案一:使用CDATA例如:&lt;if test="startTime != null" &gt; and l.CREATE_TIME &gt;= #{start..._xml特殊字符转义

从数据仓库到数据结构:数据架构的演变之路-程序员宅基地

文章浏览阅读2.1k次。数据治理(DG):Experian数据质量报告表明,全球78%的组织受到数据治理不善的困扰,这导致人们对数据和从数据获得的洞察力产生不信任。数据治理告诉我们,在数据生命周期的任何时候,数据消费者都应该知道数据的位置、格式、使用关系以及与数据相关的任何其他相关信息,以避免数据债务。使数据成为可共享的资产:使数据成为可共享的资产强调我们将数据视为一种有价值的资源,可以在不同的系统之间共享和访问。从传统的数据仓库到现代的数据网格和数据结构方法,这些架构解决了特定的挑战,带来了新的机遇。

Java版工程行业管理系统源码-专业的工程管理软件- 工程项目各模块及其功能点清单-程序员宅基地

文章浏览阅读955次,点赞15次,收藏11次。二、企业通过数字化转型,不仅有利于优化业务流程、提升经营管理能力和风险控制能力,还可强有力地促进企业体制机制的全面创新。四、在企业里建立一个管过程、提效率、降风险、控成本的工程项目管理环境,科学化、规范化是至关重要的。1、项目列表:实现对项目列表的增删改查操作,包括查看各项目的立项人、创建时间、2、项目计划管理:项目计划查看和管理模块,可执行增删改查操作,包括查看甘特图。3、收支报表:项目收支报表,包含总体收支、项目收支和收支统计模块。1、项目汇总:项目汇总信息查看,包括进度、计划时间等信息。

杂项-安全:容灾系统-程序员宅基地

文章浏览阅读503次。ylbtech-杂项-安全:容灾系统容灾系统,对于IT而言,就是为计算机信息系统提供的一个能应付各种灾难的环境。当计算机系统在遭受如火灾、水灾、地震、战争等不可抗拒的自然灾难以及计算机犯罪、计算机病毒、掉电、网络/通信失败、硬件/软件错误和人为操作错误等人为灾难时,容灾系统将保证用户数据的安全性(数据容灾),甚至,一个更加完善的容灾系统,还能提供不间断的应用服务(应用容..._备中心不影响主中心性能,

随便推点

Intellij IDEA--生成UML类图的方法_intellij idea生成java uml-程序员宅基地

文章浏览阅读3.1k次。本文介绍Idea如何生成UML类图。_intellij idea生成java uml

idea识别不到maven下载的jar_idea maven有jar包却不能识别-程序员宅基地

文章浏览阅读963次。Maven初级问题_idea maven有jar包却不能识别

珞珈一号数据预处理完整流程及一些总结_arcgis滤波器在哪里-程序员宅基地

文章浏览阅读7.2k次,点赞18次,收藏65次。珞珈一号的噪声噪点什么的都非常多,想要去噪声个人总结出了很多方法:1.arcgis滤波器(空间分析工具——邻域分析——滤波器:低通滤波)2.envi低通滤波(同上面的工具,特点是可以平滑图像减少噪声同时会减少细节)3.利用自然间断点分级法来进行灯光分级(级别越多越好,分的越细,阈值也就更加精确),分级后从中选择适合的灯光值作为阈值以去除噪声4.老方法(不变目标区域法):选择同年同月份的npp影像,默认npp影像上DN值为0的地方在珞珈一号DN值也为0,以此作为掩膜去剔除噪声…(方法很多,仅供参考)_arcgis滤波器在哪里

NBT封面:水稻NRT1.1B基因调控根系微生物组参与氮利用(作者解读)-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏11次。https://www.nature.com/nbt/volumes/37/issues/6Nature Biotechnology杂志2019年6月5日(37卷第6期),中科院遗传发..._nrt1.1b is associated with root microbiota composition and nitrogen use in f

java控制台内容覆盖_Java代码自动生成注释,运行后在控制台输入文件路径就可以将该路径下的文件都加上注释,不会覆盖已有的注释...-程序员宅基地

文章浏览阅读67次。Java代码自动生成注释,运行后在控制台输入文件路径就可以将该路径下的文件都加上注释,不会覆盖已有的注释代码片段:/*** 此类文件作用于为大量类文件* 加上类注释,方法注释* 加注释时不会覆盖已有注释* @author lKF44520* @date 2011-07-20*/public class RemarkHelper {public static void main(String[]..._修改javadoc注释怎么覆盖代码已有的注释

数字电视中相关概念1 :码率、符号率、带宽、宽带_符号率 范围 dvbc-程序员宅基地

文章浏览阅读7.3k次。数字通信的理论是:8MHz是载波带宽,因为调制是双边带的,其基带带宽为4MHz。Nyquist理论说,每Hz的带宽可以传输2symbol/s的数据,这个说法是说发送滤波器可以做到理想频率响应。那么在正常情况下做不到的,所以最常用的设计方法是升余弦响应,这种设计有个特征系数就滚降因子,如为0.15,所以可以使用的有效带宽就为4/1.15=3.478MHz。这样在3.478MHz的基带带宽内可以传输的_符号率 范围 dvbc

推荐文章

热门文章

相关标签