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

news2024/11/15 4:31:54

在这里插入图片描述

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

文章目录

  • 列表渲染
    • 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元素重用方法。

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

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

相关文章

node-day3-es6模块化+webpack

模块化 一、模块化分类 回顾node.js模块化&#xff1a; node.js遵循了CommonJS的模块化规范【见下文】&#xff0c;其中&#xff1a; 1.导入其它模块使用require()方法 2.模块对外共享成员使用module.exports对象 模块化的好处&#xff1a; 大家都遵守同样的模块化规范写代…

Only fullscreen opaque activities can request orientation

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、分析四、 推荐阅…

【电工学笔记】上册第一、二章

电工学 上次考试败在了单位&#xff0c;这次单位 一定要记熟。 第一章 电源或信号源的电压或电流称为激励,它推动电路工作; 由激励所产生的电压和电流称为响应。 复杂电路中,一般无法事先判断某个支路电流的 实际方向或者某个电路元件电压的实际方向 140V/4算不出总电阻的 …

leetcode26---删除有序数组中的重复项

大家好&#xff0c;我是大唐&#xff0c;刚刷完了几道经典的leetcode题&#xff0c;今天给大家分享一道leetcode上面的快慢指针经典题型---删除有序数组中的重复项&#xff0c;我们往下看。 题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你原地删除重复出现的元…

【数据结构】拆分详解 - 排序

文章目录 前言一、排序的概念及其运用  1.1 排序的概念  1.2 排序的运用  1.3 常见的排序算法  1.4 排序算法性能测试对比函数 二、常见排序算法的实现  2.1 插入排序   2.1.1  基本思想   2.1.2  直接插入排序   2.1.3  希尔排序     1. 预排序&am…

Dataset 读取数据

Dataset 读取数据 from torch.utils.data import Dataset from PIL import Image import osclass Mydata(Dataset):def __init__(self,root_dir,label_dir):self.root_dir root_dir #根目录 dataset/trainself.label_dir label_dir #标签的后面链接目录 ants_ima…

ChatGPT 提问没反应了,怎么办?4种方法!试试看

用了将近 1 年的 ChatGPT 昨天下午提问忽然之间没反应了&#xff0c;有点失落&#xff0c;我原本以为是账号到期了呢。 之后&#xff0c;尝试用谷歌邮箱注册登录也不行。 打开调试一看&#xff0c;接口状态 403 &#xff0c;没有权限了&#xff0c;logout。 怎么办呢&#xf…

2023年12月CCF-GESP编程能力等级认证Python编程七级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(每题 2 分,共 30 分) 第1题 假设变量 x 为 float 类型,如果下面代码输入为 100,输出最接近( )。 A.0 B.-5 C.-8 D.8 答案:B 第2题 对于下面动态规划方法实现的函数,以下选项中…

【Nestjs实操】服务依赖注入

在开始学习之前&#xff0c;我们首先准备下开发环境&#xff1a; Node&#xff1a;16.20.2包管理器&#xff1a;pnpmnestjs版本&#xff1a;10.2.1全局安装nestjs命令行&#xff1a;pnpm add -g nestjs/cli 一、初始化项目 执行nest new nestjs-blog&#xff0c;系统会自动创…

关于 JVM

1、请你谈谈你对JVM的理解&#xff1f; JVM由JVM运行时数据区&#xff08;图示中蓝色框包含部分&#xff09;、执行引擎、本地库接口、本地方法库组成。 JVM运行时数据区&#xff0c;分为方法区、堆、虚拟机栈、本地方法栈和程序计数器。 1.方法区 Java 虚拟机规范中定…

黑马点评-异步秒杀实现

异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单 4、校验是…

Draco点云压缩测试

ref&#xff1a;https://github.com/google/dracohttps://codelabs.developers.google.com/codelabs/draco-3d/index.html#6 Draco Draco 是一个用于编码压缩和解压缩 3D 几何网格和点云的库&#xff0c;从而改进 3D 图形的存储和传输该代码支持压缩点、连接信息、纹理坐标、颜…

个人代码分享(底层模板函数和三大模板)2024.3.6

源码&#xff1a;&#xff08;百度网盘&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1jdfrQOGCWJaQgSUPEWcfdw?pwd1234 提取码&#xff1a;1234 说明&#xff1a; 从复习到应用所有学到的东西去做真题&#xff0c;笔者对于之前发过的文章里面的代码有着很多改动&…

用msvc编译器的cl.exe将gcc编译器的.s汇编文件转masm编译器的.asm文件

用msvc编译器的cl.exe将gcc编译器的.s汇编文件转masm编译器的.asm文件 cl /nologo /X /II:/code/reactos-master/sdk/include/asm /II:/code/reactos-master/output-VS-amd64-sln/sdk/include/asm -II:/code/reactos-master/sdk/include -II:/code/reactos-master/sdk/include…

051-WEB攻防-前后台功能点文件下载文件读取文件删除目录遍历目录穿越

051-WEB攻防-前后台功能点&文件下载&文件读取&文件删除&目录遍历&目录穿越 #知识点&#xff1a; 1、文件安全-前后台功能点-下载&读取&删除 2、目录安全-前后台功能点-目录遍历&目录穿越 演示案例&#xff1a; ➢文件安全-下载&删除-案例…

Centos 安装 redis【最简单】

Centos7 使⽤ yum 安装 ⾸先安装 scl 源, 再安装 redis &#xff08;因为 Centos7 yum 提供的软件包只有 3.0 版本的 Redis &#xff0c;太老了&#xff0c;我们要安装 redis 5 系列的&#xff09; yum install centos-release-scl-rh yum install rh-redis5-redis 创建符号…

阿里云99计划优惠:云服务器租用价格61元、99元、165元

阿里云99计划还有谁不知道么&#xff1f;阿里云不杀熟&#xff0c;新老用户同享&#xff0c;阿里云服务器99元一年&#xff0c;续费也是99元&#xff0c;续费不涨价家人们&#xff0c;2024年阿里云把云服务器价格打下来了&#xff0c;2核2G、2核4G、4核8G、4核16G、8核16G、8核…

《在“裸奔”时代下如何保护网络隐私》

引言 在信息时代的今天,网络已经成为我们生活中不可或缺的一部分。然而,随着网络的普及和技术的发展,网络安全和隐私保护问题也变得越来越严峻。特别是在这个所谓的“裸奔”时代,我们的个人信息和隐私正面临着前所未有的挑战。因此,保护网络隐私变得尤为重要。 网络安全…

吴恩达deeplearning.ai:机器学习的开发过程与优化方法

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 我想在接下来分析下开发机器学习系统的过程&#xff0c;这样当你自己动手时&#xff0c;能够做出更加正确的判断。 机器学习开发的迭代 Iterative loop of ML development 决定模型架构 第…

flink实战--Flink任务资源自动化优化

背景 在生产环境Flink任务资源是用户在实时平台端进行配置,用户本身对于实时任务具体配置多少资源经验较少,所以存在用户资源配置较多,但实际使用不到的情形。比如一个 Flink 任务实际上 4 个并发能够满足业务处理需求,结果用户配置了 16 个并发,这种情况会导致实时计算资…