v-for复习

news2024/11/25 12:48:42

 在真实开发中,我们往往会从服务器拿到一组数据,并且需要对其进行渲染。
 这个时候我们可以使用 v-for 来完成;
 v-for 类似于 JavaScript 的 for 循环,可以用于遍历一组数据;

 

1.v-for 基本使用

 v-for 的基本格式是 "item in 数组 " :
 数组通常是来自 data 或者 prop ,也可以是其他方式;
 item 是我们给每项元素起的一个别名,这个别名可以自定来定义;
 我们知道,在遍历一个数组的时候会经常需要拿到数组的索引:
 如果我们需要索引,可以使用格式: "(item, index) in 数组 " ;
 注意上面的顺序:数组元素项 item 是在前面的,索引项 index 是在后面的;

<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>
  <style>
    .item {
      margin-top: 5px;
      background-color: orange;
    }
 
    .item .title {
      color: red;
    }
  </style>
</head>
<body>
 
  <div id="app">
    <!-- 1.电影列表进行渲染 -->
    <h2>电影列表</h2>
    <ul>
      <li v-for="movie in movies">{{ movie }}</li>
    </ul>
 
    <!-- 2.电影列表同时有索引 -->
    <ul>
      <li v-for="(movie, index) in movies">{{index + 1}} - {{ movie }}</li>
    </ul>
 
    <!-- 3.遍历数组复杂数据 -->
    <h2>商品列表</h2>
    <div class="item" v-for="item in products">
      <h3 class="title">商品: {{item.name}}</h3>
      <span>价格: {{item.price}}</span>
      <p>秒杀: {{item.desc}}</p>
    </div>
  </div>
   
  <script src="../lib/vue.js"></script>
  <script>
    // 1.创建app
    const app = Vue.createApp({
      // data: option api
      data() {
        return {
          // 1.movies
          movies: ["星际穿越", "少年派", "大话西游", "哆啦A梦"],
 
          // 2.数组: 存放的是对象
          products: [
            { id: 110, name: "Macbook", price: 9.9, desc: "9.9秒杀, 快来抢购!" },
            { id: 111, name: "iPhone", price: 8.8, desc: "9.9秒杀, 快来抢购!" },
            { id: 112, name: "小米电脑", price: 9.9, desc: "9.9秒杀, 快来抢购!" },
          ]
        }
      },
    })
 
    // 2.挂载app
    app.mount("#app")
  </script>
</body>
</html>

2.v-for 支持的类型

 v-for 也支持遍历对象,并且支持有一二三个参数:
 一个参数: "value in object";
 二个参数: "(value, key) in object";
 三个参数: "(value, key, index) in object";
 v-for 同时也支持数字的遍历:
 每一个 item 都是一个数字;
 v-for 也可以遍历其他可迭代对象 (Iterable),比如对象

<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>
      <li v-for="(value, key, index) in info">{{value}}-{{key}}-{{index}}</li>
    </ul>
 
    <!-- 3.遍历字符串(iterable) -->
    <ul>
      <li v-for="item in message">{{item}}</li>
    </ul>
 
    <!-- 4.遍历数字 -->
    <ul>
      <li v-for="item in 100">{{item}}</li>
    </ul>
  </div>
   
  <script src="../lib/vue.js"></script>
  <script>
    // 1.创建app
    const app = Vue.createApp({
      // data: option api
      data() {
        return {
          message: "Hello Vue",
          movies: [],
          info: { name: "why", age: 18, height: 1.88 }
        }
      },
    })
 
    // 2.挂载app
    app.mount("#app")
  </script>
</body>
</html>

3.数组更新检测

 Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。
 这些被包裹过的方法包括:
 push()
 pop()
 shift()
 unshift()
 splice()
 sort()
 reverse()
 替换数组的方法
 上面的方法会直接修改原来的数组;
 但是某些方法不会替换原来的数组,而是会生成新的数组,比如 filter() 、 concat() 和 slice() ;

<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>
    // 1.创建app
    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()
          // this.names.splice(2, 1, "why")
          // this.names.sort()
          // this.names.reverse()
 
          // 3.不修改原数组的方法是不能侦听(watch)
          const newNames = this.names.map(item => item + "why")
          this.names = newNames
        }
      }
    })
 
    // 2.挂载app
    app.mount("#app")
  </script>
</body>
</html>

4.v-for 中的 key 是什么作用?

 在使用 v-for 进行列表渲染时,我们通常会给元素或者组件绑定一个 key 属性。
 这个 key 属性有什么作用呢?我们先来看一下官方的解释:
 key 属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes ;
 如果不使用 key , Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改 / 复用相同类型元素的算法;
 而使用 key 时,它会基于 key 的变化重新排列元素顺序,并且会移除 / 销毁 key 不存在的元素;


 官方的解释对于初学者来说并不好理解,比如下面的问题:
 什么是新旧 nodes ,什么是 VNode ?
 没有 key 的时候,如何尝试修改和复用的?
 有 key 的时候,如何基于 key 重新排列的?

 Vue 事实上会对于有 key 和没有 key 会调用两个不同的方法;
 有 key ,那么就使用 patchKeyedChildren 方法;
 没有 key ,那么久使用 patchUnkeyedChildren 方法;

 

没有 key 的过程如下

 上面的 diff 算法效率并不高:
 c 和 d 来说它们事实上并不需要有任何的改动;
 但是因为我们的 c 被 f 所使用了,所有后续所有的内容都要一次进行改动,并且最后进行新增;

有 key 执行操作(源码)

 

 结论,调用数组进行更新时最好使用key,这样可以提高更新效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/765896.html

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

相关文章

水雨情自动监测系统-水雨情监测设备

近年来&#xff0c;暴雨及极端天气越来越频发&#xff0c;造成了洪涝与积水灾害给各地排水相关部门带来了巨大的压力&#xff0c;也给公众的生命财产损失带来了巨大的风险。为降低洪涝造成的损失&#xff0c;我们不仅要加强排水基础建设&#xff0c;还要提升实时监测手段&#…

一、音频基础-音频分析的重要工具(语谱图)

文章目录 1. 傅里叶转换2. 语谱图3. 应用1. 傅里叶转换 通过前面的描述可以知道,声音的本质就是各种声波,那么任意某一个时刻,都不可能是只有一个频率的波,而且声波也不可能是我们理解的标准的正弦波: 而一般我们对声音进行处理时,需要分析出频率当中的有哪些频率,然…

EasyPlayer流媒体视频播放器宽屏模式的开发与实现

EasyPlayer流媒体视频播放器可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持RTSP、RTMP、HLS、FLV、WebRTC等格式的视频流播放&#xff0c;并且已实现网页端实时录像、在iOS上实现低延时直播等功能。 EasyPlayer.js播放器目前可支持全屏播放&…

mybatis-plus Integer类型null值无法修改的问题

我们来看一条数据&#xff0c; 我现在要更新这个数据&#xff0c;除了id&#xff0c;全部设为null. 我们来看下数据库&#xff1a; 这个age很明显没有设置成null. 这是因为这个age是Integer类型的&#xff0c;而且我们使用的是mybatis的原生方法&#xff0c; 解决方案&#xf…

抖音seo源码/抖音seo优化矩阵系统代开发源代码搭建

抖音seo源码/抖音seo源码代开发/抖音seo技术搭建系统应用代码编程&#xff1a; 抖音seo源码&#xff0c;抖音seo矩阵系统底层框架上支持了从ai视频混剪&#xff0c;视频批量原创产出&#xff0c;云端直播数字人视频制作&#xff0c;账号矩阵&#xff0c;视频一键分发&#xff…

【学会动态规划】不同路径 II(6)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

v-model绑定的数据与接收到的数据类型不一致引发的bug

在使用v-model的过程中 当页面渲染需要的数据类型与data中定义的数据类型不一致时&#xff0c;页面是不会进行响应式对应渲染的、 如:1:绑定的是string的时候&#xff0c;在定义时是number类型 也会导致页面不更新 2:列表下拉框的选中的数据若定义的是number的话&#xff0c;传…

静电接地桩的使用和维护

静电接地桩&#xff0c;也称为静电防护接地桩或静电消散接地桩&#xff0c;是一种用于防止静电积聚和降低电荷积聚的设备。它主要通过将静电荷导引到地下&#xff0c;实现静电的释放和中和。 静电接地桩通常由导电材料制成&#xff0c;如铜、铝等金属材料。它们通常以垂直方式…

目标追踪的方向分析

方向分析 目标运动方向分析的一种最常用方法是光流法&#xff0c;光流法通过相邻两帧图像中光流近似目标的运动。光流法比较适于估计较短时间内的目标运动趋势&#xff08;如相邻几帧&#xff09;&#xff0c;且光流法对图像噪声非常敏感&#xff0c;如下图&#xff0c;为…

矩阵AB和BA的特征值相同

手写的&#xff0c;如下图&#xff1a; 即可证明&#xff0c;矩阵AB的特征值和BA的特征值相同。 关于矩阵转置和逆矩阵混合运算&#xff0c;有如下规律&#xff1a;

Ubuntu关闭自动休眠

一、查看当前休眠模式 使用systemctl status sleep.target 命令查看当前休眠模式&#xff0c;结果如下图&#xff0c;sleep状态为enabled&#xff0c;表示自动休眠模式开启。 二、关闭自动休眠模式 使用sudo systemctl mask sleep.target suspend.target 关闭休眠模式 三…

力扣算法数学类—最大交换

目录 最大交换 题解&#xff1a; 代码&#xff1a; 最大交换 670. 最大交换 - 力扣&#xff08;LeetCode&#xff09; 给定一个非负整数&#xff0c;你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 : 输入: 2736 输出: 7236 解释: 交换数字2和数字7。 …

没看完这篇文章,别说你会用WBS

大家好&#xff0c;我是老原。 为什么很多人明明有了很多工具和方法&#xff0c;还是做不好工作&#xff1f; 有没有想过&#xff0c;什么样的人才是“会工作“ 的人&#xff1f; 罗振宇在启发俱乐部里&#xff0c;对“会工作”做了一个解释。 “会工作的人&#xff0c;就是…

一种自平衡解决数据倾斜的分表方法

1、背景 这篇主要描述了B端令牌系统应用数据分表解决业务数据量增大&#xff0c;且存在的数据倾斜问题&#xff0c;主要面向的场景是一对多数据倾斜问题 1&#xff09;B令牌的业务背景 先简述一下B令牌的业务背景&#xff0c;B令牌系统是用于营销场景中&#xff0c;将许多用…

写给后端开发的『vue3』请求后端接口

本文分享一下在vue3前端项目中请求后端接口获取数据。比较简单&#xff0c;内容如下&#xff1a; 1、使用axios请求后端接口 首先npm install axios&#xff0c;添加axios依赖&#xff0c;就靠它来请求后端接口了&#xff0c;基本等同于使用jquery发ajax。 # src/main.js i…

制作Ubuntu20.04系统盘教程

下载ios系统镜像&#xff1a;http://releases.ubuntu.com/20.04/ 下载启动盘制作工具&#xff1a;http://rufus.ie/downloads/ 安装后&#xff0c;在如下软件界面进行U盘系统的写入&#xff1a;

strcmp函数和strncmp函数【C语言】

strcmp函数和strncmp函数 strcmp函数一、strcmp函数的简介二、strcmp函数的功能三、strcmp函数的使用四、strcmp函数的模拟 strncmp函数一、strncmp的简介二、strncmp函数的功能三、strncmp函数的使用 strcmp函数 一、strcmp函数的简介 strcmp函数在库函数中的定义&#xff1…

STM32 ADC基础知识讲解

文章目录 前言一、ADC的基本介绍二、STM32 ADC讲解1.ADC分辨率2.ADC通道讲解3.ADC转换模式单次转换模式连续转换模式 4.扫描模式5.数据对齐方式左对齐右对齐 总结 前言 在正式的学习如何编写ADC代码时我们先来学习一下ADC的基础知识部分&#xff0c;只有掌握好了这些基础知识才…

打造i-SMART智能网联平台,亚马逊云科技助力上汽快速出海

当前在各大外资车企不断加码在华投资之际&#xff0c;越来越多的中国汽车品牌纷纷开始走出国门&#xff0c;加速推进全球化业务&#xff0c;将赛道转至更为广阔的海外市场。 上汽海外出行科技有限公司&#xff08;简称“上汽海外出行”&#xff09;成立于2018年&#xff0c;承…

华为OD机试真题 Java 实现【挑选字符串】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题…