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

news2024/9/22 15:33:55

一、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 api
        data() {
          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 api
        data() {
          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 api
        data() {
          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.coloradmin.cn/o/447520.html

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

相关文章

Kubeadm方式搭建K8s高可用集群【1.23.0版本】

文章目录 一、集群规划及架构二、系统初始化准备(所有节点同步操作)三、安装kubeadm(所有节点同步操作)四、高可用组件安装及配置1、安装Nginx及配置2、安装keepalived及配置 五、初始化Master集群六、扩容K8S集群1、扩容master节点2、扩容node节点 七、安装网络组件Calico八、…

电脑文件剪切到U盘,为什么不见了?这4个技巧帮你找回丢失文件

文件剪切是指对计算机中的文件进行移动操作&#xff0c;将文件从原先的位置剪切到新的位置&#xff0c;然后将这些文件粘贴到新的位置&#xff0c;以完成文件的整个剪切操作。虽然剪切操作起来并不难&#xff0c;但是近日&#xff0c;有位小伙伴遇到了将电脑文件剪切到u盘后出现…

【C++】模板(二)

文章目录 非类型模板参数简单对容器array&#xff08;c11&#xff09;介绍及对比模板特化函数模板特化类模板特化全特化偏特化 模板分离模板总结 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者type…

文献智能管理工具

当下载的文献非常多的时候&#xff0c;对文献的管理将是一个非常耗时且困难的工作。困难主要来自两个方面&#xff0c;一是文献的分类&#xff0c;当文献属于多个类别的时候&#xff0c;究竟应该放在哪个类别的文件夹下&#xff0c;还是说每个类别的文件夹下都放一个该文献的备…

传输层重点协议之【TCP协议】

1. TCP协议段格式 2. TCP原理 2.1 可靠性机制 2.1.1 确认应答 确认应答是实现可靠性的最核心机制 首先来看一个例子&#xff0c;下面是我和女神的对话~ 所以为了解决上述问题呢&#xff0c;就需要针对消息进行编号&#xff01;给发送的消息分配一个”序号“&#xff0c;同时…

【蓝桥杯省赛真题21】python二十四节气 青少年组蓝桥杯比赛python编程省赛真题解析

目录 python二十四节气 一、题目要求 1、编程实现 2、输入输出 二、解题思路

SpringBoot整合ClickHouse

目录 1 ClickHouse准备操作2 使用jdbc方式操作ClickHouse3 SpringBoot的整合ClickHouse 1 ClickHouse准备操作 使用的JDBC方式操作clickhouseclickhouse与springboot的整合使用 提前创建一张表&#xff0c;并为该表插入一些实验数据 create table t_order01(id UInt32,sku_id…

卡片+递增三元组——蓝桥杯(JAVA解法)

1、卡片 题目链接&#xff1a;用户登录https://www.lanqiao.cn/problems/2383/learning/?page5&first_category_id1&sortstudents_count 问题描述 小蓝有 k 种卡片, 一个班有 n 位同学, 小蓝给每位同学发了两张卡片, 一 位同学的两张卡片可能是同一种, 也可能是不同…

xubuntu16.04下安装向日葵并设置开机自启

1.安装Sunlogin 下载 SunloginClient-11.0.1.44968-amd64.deb 解压后将SunloginClient-11.0.1.44968-amd64.deb拷贝到目标设备上&#xff0c;终端运行&#xff1a; dpkg -i SunloginClient-11.0.1.44968-amd64.deb进入到\usr/local/sunlogin/bin目录下&#xff0c;运行向日葵…

第一章 Maven概述

第一节 为什么要学习Maven&#xff1f; maven-作为依赖管理工具 ①jar 包的规模 随着我们使用越来越多的框架&#xff0c;或者框架封装程度越来越高&#xff0c;项目中使用的jar包也越来越多。项目中&#xff0c;一个模块里面用到上百个jar包是非常正常的。 比如下面的例子…

FreeRTOS 队列(二)

文章目录 一、向队列发送消息1. 函数原型&#xff08;1&#xff09;函数 xQueueOverwrite()&#xff08;2&#xff09;函数 xQueueGenericSend()&#xff08;3&#xff09;函数 xQueueSendFromISR()、xQueueSendToBackFromISR()、xQueueSendToFrontFromISR()&#xff08;4&…

GIT的常见命令

前言&#xff1a; 在日常生活或者工作中&#xff0c;我们都会是不是用到Git&#xff0c;今天我就总结了一些Git常见命令。若有些木有的&#xff0c;可以使用git help 获取到git的常见命令&#xff0c;那我们接下来就从git help 中的介绍常见命令。 一&#xff1a;建立本地仓库…

TCP 与 bufferbloat

说到既能降低成本&#xff0c;又能降低时延&#xff0c;总觉得这在 pr&#xff0c;兜售自己或卖东西。毕竟哪有这么好的事&#xff0c;鱼与熊掌兼得。可事实上是人们对 buffer 的理解错了才导致了这种天上掉馅饼的事发生。 人们总觉得 buffer 越大越好&#xff0c;buffer 越大…

Maven安装教程以及修改下载镜像源等配置

第一步&#xff1a;下载maven&#xff08;本教程安装的是3.8.4&#xff09; 官方下载链接&#xff1a;Maven – Download Apache Maven Binary是可执行版本&#xff0c;已经编译好可以直接使用。 Source是源代码版本&#xff0c;需要自己编译成可执行软件才可使用。 我们选择…

【WSN定位】基于RSSI的加权质心定位算法【Matlab代码#14】

文章目录 1. 原始质心定位算法2. 基于RSSI的加权质心定位算法基本思想3. 基于RSSI的加权质心定位算法流程图4. 部分代码展示5. 运行结果展示6. 资源获取 1. 原始质心定位算法 可参考质心定位算法 2. 基于RSSI的加权质心定位算法基本思想 传统的质心算法在求解过程中只是将未…

Windows逆向安全(一)之基础知识(十六)

指针三 通过先前指针的学习&#xff0c;了解了指针和地址以及数据的关系&#xff0c;现在结合先前的知识继续学习巩固 指针遍历数组 有了先前的基础&#xff0c;再来看看如何用指针遍历数组 代码 #include "stdafx.h" void function(){short arr[5]{1,2,3,4,5};…

【ARM Coresight 4 - Rom Table 介紹】

文章目录 1.1 ROM Table1.1.1 Entry 寄存器 1.2 ROM Table 例子 1.1 ROM Table 在一个SoC中&#xff0c;有多个Coresight 组件&#xff0c;但是软件怎么去识别这些 Coresight 组件&#xff0c;去获取这些Coresight 组件的信息了&#xff1f;这个时候&#xff0c;就需要靠 Core…

COPU助力北大研究生开源公选课丨2023开源PostgreSQL内核开发通识课顺

COPU & Peking Univerisity 导读&#xff1a;2020年1月COPU&#xff08;中国开源软件推进联盟&#xff09;成员开会讨论面向高校的开源示范课程&#xff0c;由联盟副秘书长北京大学荆琦老师牵头筹备&#xff0c;并首先在北大软微学院试点。本次是中国PostgreSQL分会联合…

尚硅谷_宋红康_第14章_数据结构与集合源码

第14章_数据结构与集合源码 本章专题与脉络 1. 数据结构剖析 我们举一个形象的例子来理解数据结构的作用&#xff1a; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bgDcr8wF-1682075329317)(images/image-20220412011531879.png)] **战场&#x…

本地白嫖AI绘画 ,Stable Diffusion 初探!

本文介绍我在本地搭建 Stable Diffusion Web UI 的体验过程&#xff0c;予以记录分享。 Stable Diffusion 是 2022 年 8 发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像&#xff0c;官方项目其实并不适合新手直接使用&#xff0c;好在有使用 Stable …