【Vue】深入了解 v-for 指令:从基础到高级应用的全面指南

文章目录

    • 一、`v-for` 指令概述
    • 二、`v-for` 指令的基本用法
      • 1. 遍历数组
      • 2. 遍历对象
      • 3. 使用索引
    • 三、`v-for` 指令的高级用法
      • 1. 组件列表渲染
      • 2. 使用 key 提升性能
      • 3. 嵌套循环
    • 四、结合其他功能的高级用法
      • 1. 处理过滤和排序后的结果
      • 2. 迭代数值范围
      • 3. 结合其他命令使用
        • 模板部分 (`<template>`)
        • 脚本部分 (`<script>`)
    • 五、`v-for` 指令的注意事项

在 Vue.js 中,v-for 是一个非常重要的指令,用于渲染列表数据。通过 v-for,你可以轻松地遍历数组和对象,生成相应的 DOM 元素。本文将详细介绍 v-for 指令的基本用法、高级用法以及注意事项,帮助您在日常开发中更高效地使用这个指令。

一、v-for 指令概述

v-for 是 Vue.js 提供的一个用于遍历数组和对象的指令。它可以帮助我们在模板中动态生成列表项,语法简洁明了,非常适合在 Vue.js 中进行列表渲染。v-for 的基本语法如下:

<template><div v-for="item in items" :key="item.id">{{ item.text }}</div>
</template><script>
export default {data() {return {items: [{ id: 1, text: 'Item 1' },{ id: 2, text: 'Item 2' },{ id: 3, text: 'Item 3' }]}}
}
</script>

在上述代码中,v-for 指令遍历了 items 数组,并在每次迭代时将当前项赋值给 item,然后在模板中进行渲染。每个 div 元素都有一个唯一的 key 属性,这对于 Vue 识别和更新每个元素是非常重要的。

二、v-for 指令的基本用法

1. 遍历数组

遍历数组是 v-for 最常见的用法。你可以在数组中渲染任意类型的数据,包括字符串、数字、对象等。

<template><ul><li v-for="name in names" :key="name">{{ name }}</li></ul>
</template><script>
export default {data() {return {names: ['Alice', 'Bob', 'Charlie']}}
}
</script>

在这个例子中,v-for 遍历了 names 数组,每个名字被渲染为一个 li 元素。通过 :key="name",确保每个 li 元素都有唯一的 key

2. 遍历对象

除了数组,v-for 也可以用于遍历对象的属性。你可以使用三种方式来访问对象的键、值和索引。

<template><div v-for="(value, key, index) in user" :key="index">{{ key }}: {{ value }}</div>
</template><script>
export default {data() {return {user: {name: 'John Doe',age: 30,occupation: 'Developer'}}}
}
</script>

在这个例子中,v-for 遍历了 user 对象的属性,并在模板中渲染键和值。(value, key, index) 的顺序很重要,确保你正确地解构对象属性。

3. 使用索引

v-for 中使用索引,可以获取当前项的索引值,这在需要唯一标识符时非常有用。

<template><ul><li v-for="(item, index) in items" :key="index">{{ index }} - {{ item }}</li></ul>
</template><script>
export default {data() {return {items: ['A', 'B', 'C']}}
}
</script>

在这个例子中,index 变量表示当前项在数组中的索引位置。{{ index }} - {{ item }} 将索引和对应的项一起显示在 li 元素中。

三、v-for 指令的高级用法

1. 组件列表渲染

你可以将 v-for 用于自定义组件,从而生成组件列表。每个组件实例都会接收一个不同的 props

<template><div><user-profile v-for="user in users" :key="user.id" :user="user"></user-profile></div>
</template><script>
import UserProfile from './UserProfile.vue'export default {components: {UserProfile},data() {return {users: [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 3, name: 'Charlie' }]}}
}
</script>

在这个例子中,v-for 渲染了多个 UserProfile 组件实例,并通过 props 向每个实例传递不同的 user 数据。

2. 使用 key 提升性能

在使用 v-for 时,建议为每个列表项提供唯一的 key 属性。这样可以帮助 Vue 识别每个节点,从而提高渲染性能。

<template><ul><li v-for="item in items" :key="item.id">{{ item.name }}</li></ul>
</template><script>
export default {data() {return {items: [{ id: 1, name: 'Item 1' },{ id: 2, name: 'Item 2' },{ id: 3, name: 'Item 3' }]}}
}
</script>

在这个例子中,我们使用每个对象的 id 作为 key,确保每个列表项都有唯一的标识符,从而优化了列表的渲染和更新。

3. 嵌套循环

v-for 允许你进行嵌套循环,以便渲染嵌套的数据结构。

<template><div v-for="category in categories" :key="category.id"><h2>{{ category.name }}</h2><ul><li v-for="item in category.items" :key="item.id">{{ item.name }}</li></ul></div>
</template><script>
export default {data() {return {categories: [{ id: 1, name: 'Fruits', items: [{ id: 1, name: 'Apple' }, { id: 2, name: 'Banana' }] },{ id: 2, name: 'Vegetables', items: [{ id: 3, name: 'Carrot' }, { id: 4, name: 'Lettuce' }] }]}}
}
</script>

在这个例子中,我们有一个 categories 数组,每个类别都有一个 items 数组。通过嵌套 v-for,我们可以渲染出每个类别及其对应的项。

四、结合其他功能的高级用法

1. 处理过滤和排序后的结果

在使用 v-for 渲染列表时,你可以对数据进行过滤和排序,然后再进行渲染。

<template><ul><li v-for="item in filteredItems" :key="item.id">{{ item.name }}</li></ul>
</template><script>
export default {data() {return {items: [{ id: 1, name: 'Banana' },{ id: 2, name: 'Apple' },{ id: 3, name: 'Carrot' }],filterText: 'a'}},computed: {filteredItems() {return this.items.filter(item => item.name.toLowerCase().includes(this.filterText.toLowerCase())).sort((a, b) => a.name.localeCompare(b.name))}}
}
</script>

在这个例子中,computed 属性 filteredItems 会先对 items 进行过滤,然后再排序,最后将处理后的结果渲染到模板中。

2. 迭代数值范围

除了数组和对象,v-for 还可以用于迭代一个数值范围。

<template><ul><li v-for="n in 5" :key="n">Item {{ n }}</li></ul>
</template><script>
export default {data() {return {}}
}
</script>

在这个例子中,v-for="n in 5" 将迭代从 1 到 5 的数值范围,并渲染出对应的 li 元素。

3. 结合其他命令使用

可以将 v-for 与其他功能结合使用,以实现更复杂的数据处理。例如,结合 methodswatch 来动态更新列表。

<template><div><input v-model="newItem" @keyup.enter="addItem" placeholder="Add item"><ul><li v-for="item in items" :key="item.id">{{ item.text }}<button @click="removeItem(item.id)">Remove</button></li></ul></div>
</template><script>
export default {data() {return {newItem: '',items: [{ id: 1, text: 'Item 1' },{ id: 2, text: 'Item 2' },{ id: 3, text: 'Item 3' }]}},methods: {addItem() {if (this.newItem.trim()) {this.items.push({ id: Date.now(), text: this.newItem });this.newItem = '';}},removeItem(id) {this.items = this.items.filter(item => item.id !== id);}}
}
</script>

在这个例子中,v-for 用于渲染 items 列表,并结合 methods 来动态添加和移除列表项。

代码的详细解释:

模板部分 (<template>)
<template><div><input v-model="newItem" @keyup.enter="addItem" placeholder="Add item"><ul><li v-for="item in items" :key="item.id">{{ item.text }}<button @click="removeItem(item.id)">Remove</button></li></ul></div>
</template>
  1. <div>:最外层的容器。
  2. <input v-model="newItem" @keyup.enter="addItem" placeholder="Add item">:这是一个输入框,用于输入新的待办事项。
    • v-model="newItem":使用双向数据绑定,将输入框的值绑定到组件的 newItem 数据属性。
    • @keyup.enter="addItem":监听键盘的 Enter 键,当用户按下 Enter 键时调用 addItem 方法。
    • placeholder="Add item":输入框的占位文本,提示用户输入待办事项。
  3. <ul>:一个无序列表,用于显示待办事项。
    • <li v-for="item in items" :key="item.id">:使用 v-for指令遍历 items 数组,并生成一个 li元素。
      • v-for="item in items":遍历 items 数组,将每个元素赋值给 item
      • :key="item.id":为每个 li 元素设置一个唯一的 key,有助于 Vue 高效地更新 DOM。
    • {{ item.text }}:显示待办事项的文本。
    • <button @click="removeItem(item.id)">Remove</button>:删除按钮。
      • @click="removeItem(item.id)":当按钮被点击时,调用 removeItem 方法,并传入当前 itemid
脚本部分 (<script>)
<script>
export default {data() {return {newItem: '',items: [{ id: 1, text: 'Item 1' },{ id: 2, text: 'Item 2' },{ id: 3, text: 'Item 3' }]}},methods: {addItem() {if (this.newItem.trim()) {this.items.push({ id: Date.now(), text: this.newItem });this.newItem = '';}},removeItem(id) {this.items = this.items.filter(item => item.id !== id);}}
}
</script>
  1. data():返回组件的初始数据对象。
    • newItem:一个空字符串,用于存储新输入的待办事项文本。
    • items:一个包含三个待办事项的数组,每个待办事项都有唯一的 idtext 属性。
  2. methods:定义组件的方法。
    • addItem():添加新待办事项的方法。
      • if (this.newItem.trim()):检查 newItem 是否为空或只包含空白字符。
      • this.items.push({ id: Date.now(), text: this.newItem }):将新的待办事项对象添加到 items 数组中。使用 Date.now() 生成唯一的 id
      • this.newItem = '':将 newItem 重置为空字符串,清空输入框。
    • removeItem(id):删除待办事项的方法。
      • this.items = this.items.filter(item => item.id !== id):使用 filter 方法返回一个新的数组,包含所有 id 不等于传入的 id 的待办事项,从而实现删除操作。

五、v-for 指令的注意事项

1. 使用 key 提升性能

在使用 v-for 时,建议为每个列表项提供唯一的 key 属性。这样可以帮助 Vue 识别每个节点,从而提高渲染性能,避免不必要的重新渲染。

2. 小心嵌套循环

嵌套循环可能导致性能问题,特别是当数据量较大时。尽量减少嵌套层级,并考虑将复杂的嵌套逻辑拆分成单独的组件。

3. 数据变化的响应性

确保数据的响应性,例如,当你对数组进行直接修改时,Vue 可能无法检测到这些变化。使用 Vue 提供的方法,如 pushsplice 等,确保数据变化能够被 Vue 监听到。

通过本文的详细介绍,相信你对 Vue.js 中的 v-for 指令有了更深入的了解。在实际开发中,灵活运用 v-for,可以让你的代码更加简洁、高效。


在这里插入图片描述

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

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

相关文章

基于vue3 + vite产生的 TypeError: Failed to fetch dynamically imported module

具体参考这篇衔接&#xff1a; Vue3报错&#xff1a;Failed to fetch dynamically imported module-CSDN博客 反正挺扯淡的&#xff0c;错误来源于基于ry-vue-plus来进行二次开发的时候遇到的问题。 错误起因 我创建了一个广告管理页面。然后发现访问一直在加载中。报的是这样…

Unity点击生成节点连线

Unity点击生成节点连线 效果 2.主要代码 Test_Line 控制类 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems;public class Test_Line : MonoBehaviour {public GameObject qiu_prefab;public List<Game…

h5点击电话号跳转手机拨号

需要使用到h5的 <a>标签 我们首先在<head>标签中添加代码 <meta name"format-detection" content"telephoneyes"/>然后再想要的位置添加代码 <a href"tel:10086"> 点击拨打&#xff1a;10086 </a> 这样功能就实现…

【Day1415】Bean管理、SpringBoot 原理、总结、Maven 高级

0 SpringBoot 配置优先级 从上到下 虽然 springboot 支持多种格式配置文件&#xff0c;但是在项目开发时&#xff0c;推荐统一使用一种格式的配置 &#xff08;yml是主流&#xff09; 1 Bean管理 1.1 从 IOC 容器中获取 Bean 1.2 Bean 作品域 可以通过注解 Scope("proto…

深入浅出WebRTC—ALR

ALR&#xff08;Application Limited Region&#xff09;指的是网络传输过程中&#xff0c;由于应用层的限制&#xff08;而非网络拥塞&#xff09;导致带宽未被充分利用的情况。在这种情况下&#xff0c;应用层可能因为处理能力、手动配置或其他因素无法充分利用可用带宽&…

Mybatis配置代码解读(事务管理与连接池)

目录 配置代码解读 事务管理方式 数据库连接池 测试代码解读 SqlSessionFactory SqlSession 接口的代理对象 ▐ 前言 在上一篇文章 手把手教你搭建Mybatis框架-CSDN博客 中分享了如何搭建Mybatis框架&#xff0c;但没有对一些配置文件和语法做出详细解读&#xff0c;刚…

免费【2024】springboot 必录德健身器材用品网的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

maven私服上传jar包 400 Bad Request 错误

文章目录 前言一、直接看报错二、问题处理三 maven 私服配置说明总结 前言 maven仓库的私服,一般会存放公司或者个人封装的jar包,用来共享给二次开发和协作伙伴用,很方便 第一次发布没有问题,但是我第二次发布,开始报错了 一、直接看报错 401 无权限我这个是400 说明用户名密…

Sql Server缓冲池、连接池等基本知识(附Demo)

目录 前言1. 缓存池2. 连接池3. 彩蛋 前言 基本的知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;Mysql优化高级篇&#xff08;全&#xff09;Mysql底层原理详细剖析常见面试题&#xff08;全&#xff09; 1…

昇思25天学习打卡营第14天|计算机视觉

昇思25天学习打卡营第14天 文章目录 昇思25天学习打卡营第14天FCN图像语义分割语义分割模型简介网络特点数据处理数据预处理数据加载训练集可视化 网络构建网络流程 训练准备导入VGG-16部分预训练权重损失函数自定义评价指标 Metrics 模型训练模型评估模型推理总结引用 打卡记录…

Atom - hackmyvm

简介 靶机名称&#xff1a;Atom 难度&#xff1a;简单 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmAtom 本地环境 虚拟机&#xff1a;vitual box 靶场IP&#xff08;Atom&#xff09;&#xff1a;192.168.56.101 跳板机IP(windows 11)&#xff1…

Linux之基础IO(上)

目录 库函数文件操作 写文件 读文件 系统调用文件操作 写文件 读文件 文件描述符fd 深刻理解linux下一切皆文件 重定向原理 在c语言中我们学习了fopen&#xff0c;fread&#xff0c;fwrite接口&#xff0c;用于进行文件相关的操作&#xff0c;在之前我们学习了计算…

科普文:银行信贷系统概叙

信贷业务流程 资金需求者提交申请&#xff1a;资金需求者通过不同渠道&#xff08;如APP、网站、门店等&#xff09;提交贷款申请。 系统交互完成审批&#xff1a;系统通过自动化和人工相结合的方式&#xff0c;对贷款申请进行初步筛选和审批。 系统交互完成策略判断&#xf…

AFAC2024-基于保险条款的问答 比赛日记 llamafactory qwen npu 910B1

AFAC2024: 基于保险条款的问答挑战——我的实战日记 概述 在最近的AFAC2024竞赛中&#xff0c;我参与了基于保险条款的问答赛道。这是一次深度学习与自然语言处理的实战演练&#xff0c;旨在提升模型在复杂保险文本理解与问答生成方面的能力。本文将分享我的参赛过程&#xf…

秒杀优化: 记录一次bug排查

现象 做一人一单的时候&#xff0c;为了提升性能&#xff0c;需要将原来的业务改造成Lua脚本加Stream流的方式实现异步秒杀。 代码改造完成&#xff0c;使用Jmeter进行并发测试&#xff0c;发现redis中的数据和预期相同&#xff0c;库存减1&#xff0c;该用户也成功添加了进去…

【Linux】Linux的基本使用

一.Linux的背景知识. 1.1什么是Linux Linux是一种开源的类Unix操作系统内核. 和Windows是" 并列 "的关系. 1.2Linux的发行版本. Linux 严格意义来说只是一个 “操作系统内核”.一个完整的操作系统 操作系统内核 配套的应用程序. 由于 Linux 是一个完全开源免费…

C++:格式化输入和输出、非格式化输入和输出(控制布尔值格式、整型值格式、浮点数格式;单字节操作put和get、多字节操作getline等)

1、格式化输入和输出 (1)What 标准库定义了一组操纵符&#xff08;本质是函数或对象&#xff09;来修改流的格式状态 当操作符改变流的格式状态时&#xff0c;通常改变后的状态对所有后续 IO 都生效 (2)Which A.控制布尔值的格式 bool bFlag true; std::cout<<std::b…

HTML+CSS3网页字符下雨特效

HTMLCSS3网页字符下雨特效https://www.bootstrapmb.com/item/14952 要在HTML和CSS3中创建一个字符下雨的特效&#xff0c;我们需要使用HTML来构建基本结构&#xff0c;然后使用CSS3的动画和关键帧&#xff08;keyframes&#xff09;来创建动画效果。但请注意&#xff0c;CSS3本…

pdf的下载,后端返回工作流,前端进行转换

前端将后端返回的工作流进行转换 项目中接触到了pdf的下载和预览的功能&#xff0c;记录一下~ 这里pdf的下载和预览的接口&#xff0c;后端返回的数据结构与其他的接口返回的数据结构有点不同&#xff0c;是直接返回的工作流&#xff0c;在控制台接口的响应预览内容大致是这样…

Aquila优化算法(基本原理+matlab源代码)—— 基于Aquila Optimizer原始论文分析

Matlab源代码位于&#xff1a; Aquila Optimizer: A meta-heuristic optimization algorithm - File Exchange - MATLAB Central (mathworks.cn) 1 Aquila优化算法 AO是一种基于种群优化方法&#xff0c;受启发于Aquila捕获猎物的方式。Aquila捕获猎物的方式主要有四种&#x…