八、vue-基础之列表渲染v-for、v-for中的key属性的作用

news/2025/3/14 21:36:45/

一、v-for列表渲染

在真实开发中,我们往往会从服务器拿到一组数据,并且需要对其进行渲染。

  • 这个时候我们可以使用v-for来完成;
  • v-for类似于JavaScript的for循环,可以用于遍历一组数据;

 

二、v-for基本使用

(1)遍历数组

我们直接上demo~ 

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div id="app"><!-- 1. 遍历数组 --><!-- 2. 遍历对象 --><ul><!-- 2.1 一个参数 --><li v-for="value in info">{{value}}</li></ul><ul><!-- 2.2 两个参数 --><li v-for="(value, key) in info">{{value}} - {{key}}</li></ul><ul><!-- 2.3 三个参数 --><li v-for="(value, key, index) in info">{{value}} - {{key}} - {{index}}</li></ul></div><script src="../lib/vue.js"></script><script>const app = Vue.createApp({// data: option apidata() {return {message: "Hello Vue",movies: [],info: { name: "daxia", age: 18, height: 1.88 },}},})app.mount("#app")</script></body>
</html>

(2) 遍历对象

 

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div id="app"><!-- 1. 遍历数组 --><!-- 2. 遍历对象 --><ul><!-- 2.1 一个参数 --><li v-for="value in info">{{value}}</li></ul><ul><!-- 2.2 两个参数 --><li v-for="(value, key) in info">{{value}} - {{key}}</li></ul><ul><!-- 2.3 三个参数 --><li v-for="(value, key, index) in info">{{value}} - {{key}} - {{index}}</li></ul></div><script src="../lib/vue.js"></script><script>const app = Vue.createApp({// data: option apidata() {return {message: "Hello Vue",movies: [],info: { name: "daxia", age: 18, height: 1.88 },}},})app.mount("#app")</script></body>
</html>

(3)遍历字符串

 

(4)遍历数字

 

三、数组更新检测

 我们上代码~

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div id="app"><ul><li v-for="item in names">{{ item }}</li></ul><button @click="changeArray">修改数组</button></div><script src="../lib/vue.js"></script><script>const app = Vue.createApp({// data: option apidata() {return {names: ["abc", "cba", "nba", "aaa", "ccc"],}},methods: {changeArray() {// 1. 直接将数组修改为一个新的数组// this.names = ["why", "kobe"]// 2. 通过一些数组的方法,修改数组中的元素// this.names.push("why")// this.names.pop()// 索引,删除元素的个数(添加的话就是写0),// this.names.splice(2, 1, "why")// 排序// this.names.sort()// 反转this.names.reverse()},},})app.mount("#app")</script></body>
</html>

注意:不修改原数组的方法是不能侦听(watch)

// 3. 不修改原数组的方法是不能侦听(watch)
const newNames = this.names.map((item) => item + "why")
this.names = newNames

 

四、v-for的key属性

 

(1) 认识VNode

我们先来解释一下VNode的概念:

  • 因为目前我们还没有比较完整的学习组件的概念,所以目前我们先理解HTML元素创建出来的VNode。
  • VNode的全称Virtual Node,也就是虚拟节点
  • 事实上,无论是组件还是元素,它们最终在Vue中表示出来的都是一个个VNode;
  • VNode的本质是一个JavaScript的对象;

 

 

 我们先来理解一下,现在id=app的div元素,是不是相当于模板,以前我们是写在下面的,现在写在了上面。

vue并不会根据你写的h2,直接去给你创建一个h2元素。如果直接给你#app.append(h2元素),追加了h2元素的话, 那此时不就是真实DOM的h2元素。

他会在生成真实DOM的h2元素之前,先生成一个VNode。

那VNode到底是一个什么东西呢?

答:VNode的本质是一个JavaScript的对象。他直接用一个JavaScript对象把他表现出来了,并没有直接给你表现出一个h2元素。

假如说你的模板里面有个div元素,他会先把你这个div元素先做一个解析(源码里其实有专门的一部分代码来解析下面这个div元素的,解析成VNode),解析成啥样子的?就是下方的图。本质上就是一个java Script对象。

 

 我们有了VNode,有直接转化成我们真实DOM里面的元素吗? 答:目前还没有。

当我们有了VNode之后,我们就可以对这个Vnode进行解析了。原来我们创建的元素是div元素,原来我们创建的元素的属性是...等等。最终的话再由我们的VNode转换成真实DOM里面的元素,转换成真实DOM里面的元素之后,我们才能在这是DOM里面看到该元素,在 用户界面才能看到。(先做一个了解,后面看源码)。

(2) 虚拟DOM

有童鞋好奇,为什么非要中间加一个虚拟节点、虚拟DOM这个概念,直接创建真实DOM不好吗?

这里最主要的原因有2个:

1. 如果我们当前有个虚拟DOM,方便他去做diff算法。(在下面第六点会提到)

2. 如果有了虚拟DOM,他方便对我们的代码进行跨平台。

我们可以通过虚拟DOM转换成真实DOM,并且渲染到浏览器上面

我们也可以通过虚拟DOM,解析这个java Script对象结构变成移动端的button/view/image等类似控件,然后渲染到移动端显示出来。

我们还可以通过虚拟DOM渲染到桌面端一些控件。

我们也可以渲染到VR设备。

(3)v-for的key属性的作用

了解了VNode、虚拟DOM和真实DOM的概念之后,我们再来看下v-for的key的属性的作用。

我们来个demo,我们想要在letters里面b和c之间插入一个f怎么做?

如果我们未插入一个f之前,我们已经有了虚拟DOM,然后通过原先的虚拟DOM创建了一个真实DOM。

这个时候我们由中间某一个位置给他插入一个东西的时候,我们思考下有几种做法?

1. 第一种,原来这些节点全部不要了, 我从a开始重新创建一个个节点,然后渲染成真实DOM。(没有必要这么去做,为什么?因为刚才的a节点,b节点没有发生变化。没有必要全部销毁从0开始)

2. 第二种, a b 保留,f替代原来c的位置,后面的都得修改。后面少一个了,就去新建e节点。

这种算法的效率不高,因为这里有很多c后面开始重新需要修改的。(他并不知道上面这个c和下面的这个c可以重复利用。这就是vue没有设置key的情况下的算法。仅在中间插入的时候是这样子,如果是在最后插入的话,是没什么区别的。

3. 第三种, 跟上面第二种的区别就是,我给每一个节点加个key。这样子第二次虚拟DOM的时候,我就能知道第一次虚拟DOM的c,d,e,都是可以重复利用的。

总结:所以 v-for 加key属性的作用就是让vue更快识别出来 两个节点是同一个东西。

没有key的diff算法: 

 

有key的diff算法:

 

  

 


http://www.ppmy.cn/news/47737.html

相关文章

4.17-4.18学习总结

MD5 MD5: 1、压缩性 2、容易计算 3、抗修改性 4、弱抗碰撞 5、强抗碰撞 为什么需要MD5&#xff1f; 存储一些敏感信息的时候&#xff0c;如果不进行加密会出现安全问题。 例如&#xff1a;系统登录的密码&#xff0c;如果数据库中的密码采用明文&#xff0c;一旦数据库泄…

面了十几家公司测试岗,我终于悟了,面试无非就是这些题

测试岗的面试其实都是大同小异的&#xff0c;这里我收集整理了185道高频面试题&#xff0c;希望对在找工作或者准备跳槽的各位小伙伴有所帮助&#xff01; 一. 测试基础 1.如何制定测试计划 参考答案&#xff1a; 测试计划包括测试目标、测试范围、测试环境的说明、测试类型…

vue nextTick原理详解

vue nextTick Vue.nextTick() 是一个方法&#xff0c;用于在下次 DOM 更新循环结束之后执行延迟回调。它的实现原理是利用浏览器的异步任务队列机制&#xff0c;在 tick 时刻将回调函数放入队列中等待执行。在实现上&#xff0c;nextTick 方法会根据当前环境选择不同的底层实现…

DCQCN学习

主要思想 发送端的拥塞控制主要有两种形式&#xff0c;一种是基于发送窗口的&#xff0c;另一种是基于rate的 DCQCN是一种基于rate的CC&#xff0c;并主要由ECN机制实现 初始设置sending rate为max line rate 接下来CC主要分为三个部分 CP(Congestion Point) 交换机 出端…

MySQL数据库系统学习(从入门到精通)

MySQL数据库系统学习 一&#xff0c;了解数据库 1.什么是数据库 英文单词DataBase&#xff0c;简称DB。按照一定格式存储数据的一些文件的组合。 顾名思义&#xff1a;存储数据的仓库&#xff0c;实际上就是一堆文件。这些文件中存储了具有特定格式的数据。 2.什么是SQL S…

转义字符(\)对JavaScript中JSON.parse的影响概述

转义字符(\)对JavaScript中JSON.parse的影响 按照ECMA262第五版中的解释&#xff0c;JSON是一个提供了stringify和parse方法的内置对象&#xff0c;前者用于将js对象转化为符合json标准的字符串&#xff0c;后者将符合json标准的字符串转化为js对象。json标准参考<a href&q…

Java中的序列化与反序列化(一)

1、概述 大家好&#xff0c;我是欧阳方超。今天来看一下Java序列化与反序列化的问题。 2、序列化与反序列化 2.1、序列化与反序列化的概念 在Java中&#xff0c;序列化是将对象转换为可存储或传输的格式&#xff08;一般为字节流&#xff09;的过程&#xff0c;序列化后的字…

为什么网络安全缺口很大,招聘却很少?

2020年我国网络空间安全人才数量缺口超过了140万&#xff0c;就业人数却只有10多万&#xff0c;缺口高达了93%。这里就有人会问了&#xff1a; 1、网络安全行业为什么这么缺人&#xff1f; 2、明明人才那么稀缺&#xff0c;为什么招聘时招安全的人员却没有那么多呢&#xff1…