【vue.js】文档解读【day 3】 | 列表渲染

在这里插入图片描述

如果阅读有疑问的话,欢迎评论或私信!!

文章目录

  • 列表渲染
    • v-for
    • v-for 与对象
    • 在 `v-for` 里使用范围值
    • `template` 上的 `v-for`
    • v-for与v-if
    • 通过key管理状态
    • 组件上使用v-for
    • 数组变化侦测

列表渲染

v-for

在我们想要渲染出一个数组中的元素时,在JavaScript中,我们可能会想到循环使用document.createElement创建标签,并且赋予变量值。

而vue中提供给了我们v-for指令,可以更方便快捷的渲染一个列表标签。v-for中的值需要使用item in items的语法,其中item是别名,也就是自命名的变量,用于在当前作用域中使用。而items是一个数组名。例如:

<template>
  <p v-for="myCustom in myArr" class="active">{{ myCustom }}</p>
</template>

<script>
export default {
  data() {
    var myArr  = [1,2,3,4,5,6,7,8,9,10]
    return {
      myArr
    };
  }
};
</script>

该代码渲染除了10个p标签,并且同时class等属性也会保存。

除此之外,我们可以使用v-for指令的第二个可选参数来使用数组中的索引值。例如:

<template>
  <p v-for="(myCustom,index) in myArr" class="active">{{ myCustom  }} - {{  	   index }}</p>
</template>

<script>
export default {
  data() {
    var myArr  = [1,2,3,4,5,6,7,8,9,10]
    return {
      myArr
    };
  }
};
</script>

在官方文档中有一句话:在 v-for 块中可以完整地访问父作用域内的属性和变量。也就是我们可以访问myArr的同胞属性,emm…这个应该本来是可以的吧,只要是这个实例中data返回的对象,都可以被插入到DOM中。这句话也可能是为了给下文嵌套v-for讲的。

在多层嵌套的v-for中,作用域的方式和多层嵌套for循环的方式比较像,父作用域无法访问子作用域,而子作用域可以方法父作用域。例如:

<li v-for="item in items">
  <span v-for="childItem in item.children">
    {{ item.message }} {{ childItem }}
  </span>
</li>

在vue文档中,提到可以使用of分隔符替代in,这个用法的意图可能是为了根据用户不同风格提供的,在JavaScript中,for-of用来遍历一个对象,来表示每个对象值,而for-in会返回索引值。具体怎么使用都可以,自己怎么喜欢怎么来。例如:

<div v-for="myCustom of myArr"></div>

v-for 与对象

v-for指令对数组和对象的使用方法类似,只是对于对象,第二个参数为对象的第三个参数才是目前迭代的位置索引。关于v-for对对象键的遍历,来源于ES6中Object原型上的keys方法所得到的数组。

例如:

<template>
  <p v-for="(myCustom,currentKey,currentIndex) in author" class="active">{{ myCustom  }} - {{  currentKey }} -  {{ currentIndex }}</p>
</template>

<script>
export default {
  data() {
   var author = {
      name: "John Doe",
      books: [
        "Vue 2 - Advanced Guide",
        "Vue 3 - Basic Guide",
        "Vue 4 - The Mystery",
      ],
    };
    return {
      author
    };
  }
};
</script>

输出效果:

John Doe - name - 0

[ “Vue 2 - Advanced Guide”, “Vue 3 - Basic Guide”, “Vue 4 - The Mystery” ] - books - 1

v-for 里使用范围值

v-for 可以直接接受一个整数值。在这种用例中,会将该模板基于 1...n 的取值范围重复多次。

<span v-for="n in 10">{{ n }}</span>

注意此处 n 的初值是从 1 开始而非 0

template 上的 v-for

与模板上的 v-if 类似,你也可以在 <template> 标签上使用 v-for 来渲染一个包含多个元素的块。例如:

<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider" role="presentation"></li>
  </template>
</ul>

v-for与v-if

在vue风格指南中有一句话:Never use v-if on the same element as v-for.

不要将v-if和v-for使用在同一个元素上

vue解释了下面两种情况:

如果你想要先过滤一个列表,然后决定列表中该元素是否显示,可以这样做:

<template>
  <ul v-for="currentValue in myArr">
    <li v-if="currentValue.isActive">{{ currentValue.myNumber }}</li>
  </ul>
</template>

<script>
export default {
  data() {
   var myArr  = [{
      myNumber:1,
      isActive:true
    },{
      myNumber:2,
      isActive:false
    },{
      myNumber:3,
      isActive:true
    },{
      myNumber:2,
      isActive:false
    }]
    return {
      myArr
    };
  }
};
</script>

控制台输出:1 3

如果你想要先决定是否显示一个列表,然后再进行过滤,可以这样做:

<template>
  <ul v-if="showList" >
    <li v-for="currentValue in myArr">{{ currentValue.myNumber }}</li>
  </ul>
</template>

<script>
export default {
  data() {
   var showList = true;
   var myArr  = [{
      myNumber:1,
      isActive:true
    },{
      myNumber:2,
      isActive:false
    },{
      myNumber:3,
      isActive:true
    },{
      myNumber:2,
      isActive:false
    }]
    return {
      myArr,
      showList
    };
  }
};
</script>

控制台输出:1 2 3 4

通过key管理状态

我们知道vue是有自己的响应式系统,大部分数据都是有响应式的功能,那么v-for中的数据应该也有响应式功能。也就是在v-for中的数据发生改变时,渲染出的列表也应该直接更新。

对于v-for的更新策略,vue的默认策略是“就近更新”,也就是不变动DOM的渲染顺序,而是直接改变渲染值。

我们来看两组代码:

不带key

<template>
  <div >
      <p v-for=" (item,index) in keyTest" >{{ item.myName }} -------- <input 			type="text"></p>
      <button @click="add()">添加</button>
    </div>
</template>

<script>
export default {
  data() {
   var keyTest = [
      {
        id: 0,
        myName: 1,
      },
      {
        id: 1,
        myName: 2,
      },
      {
        id: 2,
        myName: 3,
      },
      {
        id: 3,
        myName: 4,
      },
      {
        id: 4,
        myName: 5,
      },
    ];
    return {
      keyTest
    };
  },
  methods: {
    add(){
      this.keyTest.unshift({id:10,myName:'新的'});
    }
    
  },
};
</script>

在这里插入图片描述

带key

<template>
  <div >
      <p v-for=" (item,index) in keyTest" >{{ item.myName }} -------- <input 			type="text"></p>
      <button @click="add()">添加</button>
    </div>
</template>

<script>
export default {
  data() {
   var keyTest = [
      {
        id: 0,
        myName: 1,
      },
      {
        id: 1,
        myName: 2,
      },
      {
        id: 2,
        myName: 3,
      },
      {
        id: 3,
        myName: 4,
      },
      {
        id: 4,
        myName: 5,
      },
    ];
    return {
      keyTest
    };
  },
  methods: {
    add(){
      this.keyTest.unshift({id:10,myName:'新的'});
    }
    
  },
};
</script>

在这里插入图片描述

由效果图可以看出,带key之后插入元素不影响input中的值,而不带key时,只是在后面插入一个新DOM,之后修改之前的数据。

组件上使用v-for

等学完组件知识之后更新,暂存…

数组变化侦测

Vue可以侦听响应式数组的变更方法,前提是该方法会使数组变化。例如:

  • push() 在数组末尾插入一个值,并返回修改后的数组长度
  • pop() 删除数组中最后一个值,并返回该值
  • shift()在数组第一个值之前插入一个值,并返回修改后的数组长度
  • unshift() 删除数组中第一个值,并返回该值
  • splice() 在数组中指定位置插入或删除元素
  • sort() 对数组进行排序,并返回数组
  • reverse() 颠倒数组中元素的位置

对数组操作时,有的方法会直接改变数组值,而有的方法会返回一个修改后的新数组(数组副本)。大部分过于方法只会返回一个新数组,我们可以将旧数组值使用新数组覆盖,并且vue实现了一些性能更高的DOM元素重用方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】数据类型和变量

前言&#x1f49e;&#x1f49e; 啦啦啦~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;C语言笔记 &#x1f4a5;欢迎大家&#x1f973;&#x1f973;点赞✨收藏&#x1f49…

linux网络编程(概念)

概念 通信四元组 IP&#xff08;主机&#xff09; 0号地址与1号地址 端口&#xff08;进程&#xff09; 四元组组成 各种体系结构 网络的封包和解包 ip地址向物理&#xff08;mac&#xff09;地址转换 mac转换ip-------->RARP协议 TCP协议 UDP协议 socket函数接口

瑞_23种设计模式_模板方法模式

文章目录 1 模板方法模式&#xff08;Template Pattern&#xff09; ★ 钩子函数1.1 介绍1.2 概述1.3 模板方法模式的结构1.4 模板方法模式的优缺点1.5 模板方法模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析&#xff08;InputStre…

java项目线上捉BUG经验记录

一 线上问题 昨晚上突然接到公司紧急来电电桩设备大面积离线&#xff0c;意味着某市的车无法充电……”&#xff0c;细想这个平台很久都没有更新&#xff0c;最近出现问题是刚好在一个月前也是出现这种情况&#xff0c;再上一次就是几年前更新的。平台平时是稳定&#xff0c;开…

php使用ElasticSearch

ElasticSearch简介 Elasticsearch 是一个分布式的、开源的搜索分析引擎&#xff0c;支持各种数据类型&#xff0c;包括文本、数字、地理、结构化、非结构化。 Lucene与ElasticSearch Apache Lucene是一款高性能的、可扩展的信息检索&#xff08;IR&#xff09;工具库&#xf…

【企业发展战略】某环境管理集团公司发展战略与规划项目纪实

在集团公司高速发展、业务范围不断扩大时&#xff0c;组织往往对公司未来的发展方向感到迷茫&#xff0c;不知道如何进行更好的规划&#xff0c;找到合适的发展战略&#xff0c;为企业提供更长远的发展空间&#xff0c;带来更多是利益。面对这个问题&#xff0c;华恒智信认为企…

StarRocks实战——欢聚集团极速的数据分析能力

目录 一、大数据平台架构 二、OLAP选型及改进 三、StarRocks 经验沉淀 3.1 资源隔离&#xff0c;助力业务推广 3.1.1 面临的挑战 3.1.2 整体效果 3.2 稳定优先&#xff0c;监控先行&#xff0c;优化运维 3.3降低门槛&#xff0c;不折腾用户 3.3.1 与现有的平台做打通 …

Springboot+vue的物业管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的物业管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的物业管理系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff…

C++自创题目——几点了 very hard ver.

题目难度 普及 题目描述 一个老外用一口不流利的中文问你&#xff1a;“Xian zai ji dian le?”你看了一眼表&#xff0c;知道了现在是&#xff0c;你准备用这样的形式写在纸上&#xff1a; Now is m past/to h. 如果你看不懂&#xff0c;举个例子&#xff1a; 当h10&#…

运维知识点-Apache HTTP Server

Apache 介绍 介绍 Apache是一个开源的Web服务器软件&#xff0c;全称为Apache HTTP Server&#xff0c;由Apache软件基金会开发和维护。它是目前全球使用最广泛的Web服务器软件之一&#xff0c;占全球所有网络服务器的很大比例。Apache服务器具有跨平台的特性&#xff0c;可以…

【Hadoop大数据技术】——Hadoop概述与搭建环境(学习笔记)

&#x1f4d6; 前言&#xff1a;随着大数据时代的到来&#xff0c;大数据已经在金融、交通、物流等各个行业领域得到广泛应用。而Hadoop就是一个用于处理海量数据的框架&#xff0c;它既可以为海量数据提供可靠的存储&#xff1b;也可以为海量数据提供高效的处理。 目录 &#…

STM32 通过Modbus协议更改内部Flash(模仿EEPROM)的运行参数

main.c测试 uint8_t uart1RxBuf[64]{0};uint8_t Adc1ConvEnd0; uint8_t Adc2ConvEnd0;int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initial…

docker学习入门

1、docker简介 docker官网&#xff1a; www.docker.com dockerhub官网&#xff1a; hub.docker.com docker文档官网&#xff1a;docs.docker.com Docker是基于Go语言实现的云开源项目。 Docker的主要目标是&#xff1a;Build, Ship and Run Any App, Anywhere(构建&…

Java面试——Netty

优质博文&#xff1a;IT-BLOG-CN 一、BIO、NIO 和 AIO 【1】阻塞 IO(Blocking I/O)&#xff1a; 同步阻塞I/O模式&#xff0c;当一条线程执行 read() 或者 write() 方法时&#xff0c;这条线程会一直阻塞直到读取一些数据或者写出去的数据已经全部写出&#xff0c;在这期间这条…

iOS——【自动引用计数】ARC规则及实现

1.3.3所有权修饰符 所有权修饰符一共有四种&#xff1a; __strong 修饰符__weak 修饰符__undafe_unretained 修饰符__autoreleasing 修饰符 __strong修饰符 _strong修饰符表示对对象的强引用&#xff0c;持有强引用的变量在超出其作用域的时候会被废弃&#xff0c;随着强引…

Kafka入门及生产者详解

1. Kafka定义 传统定义&#xff1a;分布式的、基于发布/订阅模式的消息队列&#xff0c;主要用于大数据实时处理领域。发布/订阅模式中&#xff0c;发布者不会直接将消息发送给特定的订阅者&#xff0c;而是将发布的消息分为不同的类别&#xff0c;订阅者只接受感兴趣的消息。…

html--心动

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>html</title><style>*{padding: 0;margin: 0;}body{background-color: pink;}#frame{position: relative;width: 400px;height: 300…

【项目】Boost 搜索引擎

文章目录 1.背景2.宏观原理3.相关技术与开发环境4. 实现原理1.下载2.加载与解析文件2.1获取指定目录下的所有网页文件2.2. 获取网页文件中的关键信息2.3. 对读取文件进行保存 3.索引3.1正排与倒排3.2获取正排和倒排索引3.3建立索引3.3.1正排索引3.3.2倒排索引 4.搜索4.1 初始化…

练习3-softmax分类(李沐函数简要解析)与d2l.train_ch3缺失的简单解决方式

环境为:练习1的环境 网址为:https://www.bilibili.com/video/BV1K64y1Q7wu/?spm_id_from333.1007.top_right_bar_window_history.content.click 代码简要解析 导入模块 导入PyTorch 导入Torch中的nn模块 导入d2l中torch模块 并命名为d2l import torch from torch import nn…

pytorch CV入门3-预训练模型与迁移学习.md

专栏链接&#xff1a;https://blog.csdn.net/qq_33345365/category_12578430.html 初次编辑&#xff1a;2024/3/7&#xff1b;最后编辑&#xff1a;2024/3/8 参考网站-微软教程&#xff1a;https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorc…