Vue学习记录07

列表渲染

v-for

可以使用v-for指令基于一个数组来渲染一个列表。v-for指令的值需要使用 item in items 形式的特殊语法,其中 items 是源数据的数组, 而 item 是迭代项的别名:

const items = ref([{ message: 'Foo' }, { message: 'Bar' }])
<li v-for="item in items">{{ item.message }}
</li>

在 v-for 块中可以完整地访问父作用域内地属性和变量。 v-for 也支持使用可选的第二个参数表示当前项的位置索引。

const parentMessage = ref('Parent')
const items = ref([{ message: 'Foo' }, { message: 'Bar' }])
<li v-for="(item, index) in items">{{ parentMessage }} - {{ index }} - {{ item.message }}
</li>

v -for 变量的作用域和下面的JavaScript代码很类似:

const parentMessage = 'Parent'
const items = [/* ... */
]items.forEach((item, index) => {// 可以访问外层的 `parentMessage`// 而 `item` 和 `index` 只在这个作用域可用console.log(parentMessage, item.message, index)
})

注意 v-for 是如何对应 forEach 回调的函数签名的。 实际上,也可以在定义 v-for 的变量别名时使用解构,类似:

<li v-for="{ message } in items">{{ message }}
</li><!-- 有 index 索引时 -->
<li v-for="({ message }, index) in items">{{ message }} {{ index }}
</li>

 对于多层嵌套的 v-for ,作用域的工作方式和函数的作用域很类似。每个 v-for 作用域都可以访问到父级作用域:

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

 

也可以使用of作为分隔符来代替in,这更接近JavaScript的迭代器语法:

<div v-for="item of items"></div>

v-for与对象

也可以使用v-for来遍历一个对象的所有属性。遍历的顺序会基于该对象调用Object.values()的返回值来决定。

const myObject = reactive({title: 'How to do lists in Vue',author: 'Jane Doe',publishedAt: '2016-04-10'
})
<ul><li v-for="value in myObject">{{ value }}</li>
</ul>

可以通过提供第二个参数表示属性名(例如:key):

<li v-for="(value, key) in myObject">{{ key }}: {{ value }}
</li>

第三个参数表示位置索引:

<li v-for="(value, key, index) in myObject">{{ index }}. {{ key }}: {{ value }}
</li>

在 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

当它们同时存在于一个节点上时, v-if 比 v-for 的优先级更高。 这意味着 v-if 的条件将无法访问到 v-for 作用域内定义的变量别名:

<!--这会抛出一个错误,因为属性 todo 此时没有在该实例上定义
-->
<li v-for="todo in todos" v-if="!todo.isComplete">{{ todo.name }}
</li>

在外先包装一层<template>再在其上使用 v-for 可以解决这个问题(这样也更加明显易读):

<template v-for="todo in todos"><li v-if="!todo.isComplete">{{ todo.name }}</li>
</template>

通过key管理状态

Vue 默认按照”就地更新“的策略来更新通过 v-for 渲染的元素列表。当数据项的顺序改变时,Vue不会随之移动DOM元素的顺序,而是就地更新每个元素,确保它们在原本指定的索引位置上渲染。

默认模式是高效的,但只适用于列表渲染输出的结果不依赖子组件状态或者临时DOM状态(例如表单输入值)的情况。

为了给Vue一个提示,以便它可以跟踪每个节点的标识,从而重用和重新排序现有的元素,你需要为每个元素对应的块提供一个唯一的 key attribute:

<div v-for="item in items" :key="item.id"><!-- 内容 -->
</div>

举例来说,为下列数组添加一个元素。 

 

添加了一个王五,导致每个数组的index值发生变化,如果没有加key,所有数组是删除了后重新创建的。 如果加了:key,Vue是会保留原有数组的信息,而只添加一个数组,不会删除重建,提高了创建效率。

 为什么一般绑定key不推荐index,而推荐id? 是由于如果在最开始为数组添加数据,每个数组的index值还是都会变化,数组还是会被销毁再创建。 而绑定一个静态值id,可以有效的使数据的对应关系不会轻易变化。

推荐 在任何可行的时候为 v-for 提供一个 key attribute,除非迭代的DOM内容非常简单(例如:不包含组件或有状态的DOM元素),或者你想有意采用默认行为来提高性能。

key 绑定的值期望是一个基础类型的值,例如字符串或者number类型。

数组变化侦测

变更方法

Vue 能够侦听响应式数组的变更方法,并在它们被调用时触发相关的更新。这些变更方法包括:

push() :向数组的末尾添加一个或多个元素。

let arr = [1, 2, 3];  
arr.push(4); // arr 变为 [1, 2, 3, 4]

pop() :从数组的末尾移除一个元素。

let arr = [1, 2, 3];  
let last = arr.pop(); // arr 变为 [1, 2], last 是 3

shift() : 从数组的开头移除一个元素。

let arr = [1, 2, 3];  
let first = arr.shift(); // arr 变为 [2, 3], first 是 1

unshift() :向数组的开头添加一个或多个元素。

let arr = [1, 2, 3];  
arr.unshift(0); // arr 变为 [0, 1, 2, 3]

splice() :从数组中添加或移除元素。

let arr = [1, 2, 3];  
arr.splice(1, 1, 4, 5); // arr 变为 [1, 4, 5, 3]  
// 从索引1开始移除1个元素,并插入4和5

sort() : 对数组的元素进行排序,默认按字符串Unicode码点排序。

let arr = [3, 1, 2];  
arr.sort(); // arr 变为 [1, 2, 3]

reverse() : 反转数组中元素的顺序。

let arr = [1, 2, 3];  
arr.reverse(); // arr 变为 [3, 2, 1]

替换一个数组

变更方法,就是会对调用它们的原数组进行变更。相对地,也有一些不可变(immutable)方法,例如 filter(), concat() 和 slice(), 这些都不会更改原数组,而总是返回一个新数组。当遇到的是非变更方法时,我们需要将旧的数组替换为新的:

// `items` 是一个数组的 ref
items.value = items.value.filter((item) => item.message.match(/Foo/))

你可能认为这将导致 Vue 丢弃现有的 DOM 并重新渲染整个列表——幸运的是,情况并非如此。Vue 实现了一些巧妙的方法来最大化对 DOM 元素的重用,因此用另一个包含部分重叠对象的数组来做替换,仍会是一种非常高效的操作。

展示过滤或排序后的结果

有时,我们希望显示数组经过过滤或排序后的内容,而不实际变更或重置原始数据。在这种情况下,你可以创建返回已过滤或已排序数组的计算属性。

例如:

const numbers = ref([1, 2, 3, 4, 5, 6])const evenNumbers = computed(() => {return numbers.value.filter((n) => n % 2 === 0)
})
<li v-for="n in evenNumbers">{{ n }}</li>

 

在计算属性不可行的情况下(例如在多层嵌套的 v-for循环中),可以使用以下方法:

const sets = ref([[1, 2, 3, 4, 5],[6, 7, 8, 9, 10]
])function even(numbers) {return numbers.filter((number) => number % 2 === 0)
}
<ul v-for="numbers in sets"><li v-for="n in even(numbers)">{{ n }}</li>
</ul>

 在计算属性中使用 reverse() 和 sort() 的时候务必小心!这两个方法将变更原始数组,计算函数中不应该这么做。请在调用这些方法之前创建一个原数组的副本。

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

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

相关文章

rk3399开发环境使用Android 10初体验蓝牙功能

版本 日期 作者 变更表述 1.0 2024/11/10 于忠军 文档创建 零. 前言 由于Bluedroid的介绍文档有限&#xff0c;以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等)&#xff0c;加上需要掌握的语言包括Java/C/C等&#xff0…

微调Helsinki-NLP-en-zh模型

Helsinki-NLP 是一个广泛使用的开源机器翻译&#xff08;Machine Translation&#xff0c;MT&#xff09;模型系列&#xff0c;基于 Marian NMT 框架 Hugggingface地址&#xff1a;https://huggingface.co/Helsinki-NLP/opus-mt-en-zh 原本的模型对于国内外公司的名称支持度很…

QT基本绘图

QT绘图 1.概述 这篇文章介绍如何绘图 2.绘图基本操作 创建一个普通的widget类型的项目 在widget.h 文件中重写绘图事件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : p…

自动化立体仓库:详解

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 自动化立体仓库&#xff08;Automated S…

Hash table类算法【leetcode】

哈希表中关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用来快速判断一个元素是否出现集合里。 例如要查询一个名字是否在这所学校里。 要枚举的话时间复杂度是O(n)&#xff0c;但如果使用哈希…

window 中安装 php 环境

window 中安装 php 环境 一、准备二、下载三、安装四、测试 一、准备 安装前需要安装 Apache &#xff0c;可以查看这篇博客。 二、下载 先到这里下载 这里选择版本为“VS16 x64 Thread Safe”&#xff0c;这个版本不要选择线程安全的&#xff0c;我试过&#xff0c;会缺少文…

嵌入式Linux学习之Linux基础再过部分——文件IO(1)

目录 先来看看Linux是如何操作文件IO的 文件描述符 打开文件open pathname flags mode 返回值 write 参数详解 返回值 在哪里你能使用write flags read 返回值 flags close lseek whence 参数常量 返回值 示例 1 示例 2 demo3 深入探究文件IO Linux 系统…

C# 高级--反射 详解

一、反射是什么 1、C#编译运行过程 高级语言->编译->dll/exe文件->CLR/JIT->机器码 2、原理解析metadata&#xff1a;元数据数据清单&#xff0c;记录了dll中包含了哪些东西,是一个描述。IL&#xff1a;中间语言&#xff0c;编译把高级语言编译后得到的C#中最真…

【Web前端】Web API:构建Web应用核心

什么是 API API&#xff08;应用程序编程接口&#xff09;是一组定义了软件组件之间如何交互的规则和协议。它允许一个程序调用另一个程序的功能&#xff0c;而不用了解其内部实现细节。 Web 开发中&#xff0c;API 通常用于实现前端与后端之间的通信。 客户端 JavaScript 中的…

Telegram bot Mini-App开发实践---Telegram简单介绍与初始化小程序获取window.Telegram.WebApp对象并解析

➡️【好看的灵魂千篇一律,有趣的鲲志一百六七!】- 欢迎认识我~~ 作者:鲲志说 (公众号、B站同名,视频号:鲲志说996) 科技博主:极星会 星辉大使 后端研发:java、go、python、TS,前电商、现web3 主理人:COC杭州开发者社区主理人 、周周黑客松杭州主理人、 AI爱好…

VRT: 关于视频修复的模型

VRT: 关于视频修复的模型 1. 视频修复的背景与重要性背景介绍&#xff1a;重要性&#xff1a; 2. VRT的重要性和研究背景VRT的背景&#xff1a;VRT的重要性&#xff1a; 3. 视频修复概述3.1 定义与目标3.2 与单图像修复的区别3.3 对时间信息利用的需求 4. VRT模型详解4.1 整体框…

游戏引擎学习第17天

视频参考:https://www.bilibili.com/video/BV1LPUpYJEXE/ 回顾上一天的内容 1. 整体目标&#xff1a; 处理键盘输入&#xff1a;将键盘输入的处理逻辑从平台特定的代码中分离出来&#xff0c;放入更独立的函数中以便管理。优化消息循环&#xff1a;确保消息循环能够有效处理 …

jmeter常用配置元件介绍总结之配置元件

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…

Java基础知识(五)

文章目录 ObjectObject 类的常见方法有哪些&#xff1f; 和 equals() 的区别hashCode() 有什么用&#xff1f;为什么要有 hashCode&#xff1f;为什么重写 equals() 时必须重写 hashCode() 方法&#xff1f; 参考链接 Object Object 类的常见方法有哪些&#xff1f; Object 类…

【大模型】LLaMA: Open and Efficient Foundation Language Models

链接&#xff1a;https://arxiv.org/pdf/2302.13971 论文&#xff1a;LLaMA: Open and Efficient Foundation Language Models Introduction 规模和效果 7B to 65B&#xff0c;LLaMA-13B 超过 GPT-3 (175B)Motivation 如何最好地缩放特定训练计算预算的数据集和模型大小&…

2024 RISC-V中国峰会 安全相关议题汇总

安全之安全(security)博客目录导读 第四届 RISC-V 中国峰会(RISC-V Summit China 2024)于8月21日至23日在杭州成功举办。此次峰会汇聚了 RISC-V 国际基金会、百余家重点企业及研究机构,约3000人线下参与,并在19日至25日间举办了超过20场同期活动,与全球开发者共同…

Pyhon基础数据结构(列表)【蓝桥杯】

a [1,2,3,4,5] a.reverse() print("a ",a) a.reverse() print("a ",a)# 列表 列表&#xff08;list&#xff09;有由一系列按照特定顺序排序的元素组成 列表是有顺序的&#xff0c;访问任何元素需要通过“下标访问” 所谓“下标”就是指元素在列表从左…

【Visual Studio系列教程】如何在 VS 上编程?

上一篇博客中&#xff0c;我们介绍了《什么是 Visual Studio&#xff1f;》。本文&#xff0c;我们来看第2篇《如何在 VS 上编程&#xff1f;》。阅读本文大约10 分钟。我们会向文件中添加代码&#xff0c;了解 Visual Studio 编写、导航和了解代码的简便方法。 本文假定&…

MySQL更换瀚高语法更换

MySQL更换瀚高语法更换 一、前言二、语句 一、前言 水一篇,mysql更换瀚高之后&#xff0c;一些需要更换的语法介绍 > 二、语句 MySQL瀚高MySQL用法瀚高用法说明ifnull(x,y)coalesce(x,y)相同相同用于检查两个表达式并返回第一个非空表达式。如果第一个表达式不是 NULL&…

论文阅读——Intrusion detection systems using longshort‑term memory (LSTM)

一.基本信息 论文名称&#xff1a;Intrusion detection systems using longshort‑term memory (LSTM) 中文翻译&#xff1a;基于长短期记忆(LSTM)的入侵检测系统 DOI&#xff1a;10.1186/s40537-021-00448-4 作者&#xff1a;FatimaEzzahra Laghrissi1* , Samira Douzi2*, Kha…