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

Vue中的循环渲染v-for

v-for指令非常重要,它可以遍历数据容器,可以理解成我们以前使用的for in 循环,在很多地方都需要使用它,例如我们网络请求到数据一般都是采用v-for遍历渲染到页面上。

写法:v-for="(el,index) in arr"

el为我们遍历出的数据容器的每一项;

index为索引,从0开始,对应每一项数据;

el,index都是我们自己命名的,我们也可以写成其它的标识符,但是我们程序员一般都是使用el和index表示,index还可以不写,直接el in arr

arr为数据容器。

写一个例子演示一下:

 <div id="box">
        <div v-for="(item, index) in arr">
            {{item}}
        </div>
    </div>
    <script>
        new Vue({
            el:"#box",
            data: {
               arr:["语文","数学","英语"]
            },
        })
    </script>

循环渲染语文、数学、英语:

 可以看到box盒子下生成了三个div标签,即我们可以得出v-for会循环克隆数据容器长度个当前标签。

 在Vue2中,v-for有一个bug,就是v-for遇到v-if放在同一个标签中时,v-for的优先级会比v-if高。

在同一级会造成的问题:当arr 数据容器新增一项数据时,会对每一项再做一遍v-if 循环,然后for 循环渲染。

解决方案:采用嵌套写法,将v-for放在外层,v-if放在里层,用vue推出的template标签装v-if,为什么要用template标签呢,因为如果用其它标签渲染完成以后,v-if在那个标签也会被生成,但是它没有用,还浪费资源,所以我们用template标签,可以理解为dom操作中的fragment,完成任务过后他就会自动消失。

这样当arr 数据容器某一项数据发生变化时,只对新增的数据进行v-if 判断,节约渲染效率

代码结构:

    <div v-for="el in arr">
				<h1>{{el.name}}</h1>
				<template v-if="el.age>10">
				  <div v-for="el in el.titles">{{el}}</div>
				</template>
	</div>

遍历el.title生成的div标签会跟h1同一级,这就是template的好处,判断完它就自己销毁了。

在Vue3中修复了这个bug,框架不允许你将v-for和v-if写在同一个标签下,会报语法错误。

v-for中的key

v-for指令非常的强大,当数据容器中的数据增加时,会在vm节点后面增加对应数量的节点,并不会重新创建所有节点,然后vm去更新对应的DOM。这样极大的减少了cpu消耗,提升了性能。

但是按照for的数据容器中的数据顺序来渲染如果用户以前操作过旧节点,那么新数据顺序可能会出现跟旧节点顺序不匹配的效果(旧节点跟旧数据没有对应起来)

解决方案: for循环时把数据跟创建的节点利用给元素绑定唯一key值

写法:

<div  v-for="el in arr" :key=""></div>

在业务中:key的值一般绑定当前el中特有的id值,即使怎么加数据标签都会与数据一一对应。

相关文章:

  • openresty + prometheus + grafana 搭建。监控网络请求
  • 复盘:统计学派(频率学派)跟贝叶斯学派(贝叶斯公式、朴素贝叶斯)的定义和区别,奥卡姆剃刀和最大似然跟谁更接近
  • Java数据类型与变量
  • od笔试记录
  • Code Review
  • Kubernetes部署服务通过Ingress访问报错413解决
  • 3如何搭建组件库的样式工程之button-scss
  • 飞书第三方ISV服务商应用开发及上架教程
  • JavaScript 运算符和表达式(二)
  • js arr.reduce() reduce方法应用
  • Day 56 Django 连接数据库 ORM
  • 深度学习中的激活函数有哪些?
  • Image through Atmospheric Turbulence笔记(一)
  • 遇到的一些奇怪的bug(非代码问题)与解决方法
  • 鸟哥私房菜linux就该这么学-学习记录
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【Amaple教程】5. 插件
  • 3.7、@ResponseBody 和 @RestController
  • conda常用的命令
  • Hexo+码云+git快速搭建免费的静态Blog
  • IndexedDB
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JS实现简单的MVC模式开发小游戏
  • sublime配置文件
  • v-if和v-for连用出现的问题
  • 创建一个Struts2项目maven 方式
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从setTimeout-setInterval看JS线程
  • 从伪并行的 Python 多线程说起
  • 对象引论
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 每天10道Java面试题,跟我走,offer有!
  • 我的面试准备过程--容器(更新中)
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​低代码平台的核心价值与优势
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #define 用法
  • #stm32整理(一)flash读写
  • (2.2w字)前端单元测试之Jest详解篇
  • (vue)页面文件上传获取:action地址
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (汇总)os模块以及shutil模块对文件的操作
  • (一)appium-desktop定位元素原理
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net 程序发生了一个不可捕获的异常
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .net网站发布-允许更新此预编译站点
  • .NET文档生成工具ADB使用图文教程
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually