百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Vue 列表渲染详解_vue组件渲染顺序

itomcoil 2025-10-02 01:00 13 浏览

v-for 基本用法

v-for 是 Vue 中用于基于数组渲染列表的核心指令,它的基本语法是 item in items,其中:

  • items 是源数据数组(响应式数据)
  • item 是当前迭代项的别名,用于在模板中访问当前项的数据

示例代码

 // 定义响应式数组
 const items = ref([{ message: 'Foo' }, { message: 'Bar' }])
 <!-- 模板中使用 v-for 渲染列表 -->
 <li v-for="item in items">
   {{ item.message }}
 </li>

索引与父作用域访问

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>

输出结果

 Parent - 0 - Foo
 Parent - 1 - Bar

作用域说明

  • v-for 块内可以访问父作用域的属性(如示例中的 parentMessage
  • 迭代变量(itemindex)仅在当前 v-for 作用域内有效
  • 这与 JavaScript 中的 forEach 回调函数作用域类似

解构赋值

v-for 中可以使用对象解构,简化对嵌套数据的访问:

 <!-- 解构对象属性 -->
 <li v-for="{ message } in items">
   {{ message }}
 </li>
 
 <!-- 带索引的解构 -->
 <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>

迭代语法变体

除了 in 之外,还可以使用 of 作为分隔符,更接近 JavaScript 的迭代器语法:

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

遍历对象

v-for 不仅可以遍历数组,还可以遍历对象的属性:

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>

<!-- 包含属性名 -->
<li v-for="(value, key) in myObject">
  {{ key }}: {{ value }}
</li>

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

注意:对象遍历顺序基于 Object.values() 的返回顺序

范围值迭代

v-for 可以直接接受一个整数值,渲染从 1 到该数值的范围:

<!-- 渲染 1 到 10 的数字 -->
<span v-for="n in 10">{{ n }}</span>

注意:范围迭代从 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-forv-if 同时存在于同一节点时,v-if 具有更高的优先级,这意味着 v-if 无法访问 v-for 的迭代变量。

不推荐的用法

<!-- 错误示例:v-if 无法访问 todo -->
<li v-for="todo in todos" v-if="!todo.isComplete">
  {{ todo.name }}
</li>

正确的用法

<!-- 正确:将 v-for 放在 template 上 -->
<template v-for="todo in todos">
  <li v-if="!todo.isComplete">
    {{ todo.name }}
  </li>
</template>

最佳实践

  • 避免同时使用 v-ifv-for
  • 过滤列表:使用计算属性返回过滤后的数组
  • 条件渲染整个列表:将 v-if 移至列表容器元素

通过 key 管理状态

Vue 默认采用"就地更新"策略更新 v-for 渲染的列表,这意味着当数据顺序改变时,Vue 不会移动 DOM 元素,而是更新元素内容。

为了让 Vue 能够跟踪每个节点的标识,从而实现高效的重用和重排序,需要提供唯一的 key 属性:

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

使用 <template v-for>key 应放在 <template> 上:

<template v-for="todo in todos" :key="todo.name">
  <li>{{ todo.name }}</li>
</template>

注意事项

  • key 必须绑定唯一的值(字符串或数字)
  • 不要使用对象作为 key
  • 推荐在大多数情况下使用 key,除非列表非常简单

组件上使用 v-for

可以在组件上直接使用 v-for,但需要显式传递数据作为 props:

<MyComponent
  v-for="(item, index) in items"
  :item="item"  <!-- 传递当前项数据 -->
  :index="index"  <!-- 传递索引 -->
  :key="item.id"  <!-- 提供唯一 key -->
/>

注意:Vue 不会自动将迭代数据注入组件,必须显式通过 props 传递,这使组件更加灵活和可重用。

数组变化侦测

Vue 能够侦听响应式数组的变更,并触发视图更新,主要通过两种方式:

1. 变更方法

Vue 对数组的以下变更方法进行了包装,调用这些方法会自动触发更新:

  • push():向数组末尾添加元素
  • pop():删除并返回数组最后一个元素
  • shift():删除并返回数组第一个元素
  • unshift():向数组开头添加元素
  • splice():添加/删除数组元素
  • sort():排序数组
  • reverse():反转数组

示例

const items = ref([1, 2, 3])
items.value.push(4)  // 会触发视图更新

2. 替换数组

对于不会修改原数组的方法(如 filter()concat()slice()),需要将返回的新数组赋值给原数组:

// 过滤数组并替换原数组
items.value = items.value.filter(item => item > 2)

优化说明:Vue 会智能重用已有的 DOM 元素,因此替换数组是高效的操作,不会完全重新渲染列表。

展示过滤或排序后的结果

当需要展示数组的过滤或排序版本而不修改原数组时,可以使用计算属性:

 const numbers = ref([1, 2, 3, 4, 5])
 
 // 计算属性返回偶数
 const evenNumbers = computed(() => {
   return numbers.value.filter(n => n % 2 === 0)
 })
 <!-- 使用计算属性 -->
 <li v-for="n in evenNumbers">{{ n }}</li>

复杂场景:在多层嵌套中,可以使用方法返回过滤后的结果:

 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() 时,应先创建数组副本,避免修改原数组:

 // 错误:会修改原数组
 return numbers.reverse()
 
 // 正确:创建副本后操作
 return [...numbers].reverse()



相关推荐

Python编程实现求解高次方程_python求次幂
Python编程实现求解高次方程_python求次幂

#头条创作挑战赛#编程求解一元多次方程,一般情况下对于高次方程我们只求出近似解,较少的情况可以得到精确解。这里给出两种经典的方法,一种是牛顿迭代法,它是求解方程根的有效方法,通过若干次迭代(重复执行部分代码,每次使变量的当前值被计算出的新值...

2025-10-23 03:58 itomcoil

python常用得内置函数解析——sorted()函数

接下来我们详细解析Python中非常重要的内置函数sorted()1.函数定义sorted()函数用于对任何可迭代对象进行排序,并返回一个新的排序后的列表。语法:sorted(iterabl...

Python入门学习教程:第 6 章 列表

6.1什么是列表?在Python中,列表(List)是一种用于存储多个元素的有序集合,它是最常用的数据结构之一。列表中的元素可以是不同的数据类型,如整数、字符串、浮点数,甚至可以是另一个列表。列...

Python之函数进阶-函数加强(上)_python怎么用函数

一.递归函数递归是一种编程技术,其中函数调用自身以解决问题。递归函数需要有一个或多个终止条件,以防止无限递归。递归可以用于解决许多问题,例如排序、搜索、解析语法等。递归的优点是代码简洁、易于理解,并...

Python内置函数range_python内置函数int的作用

range类型表示不可变的数字序列,通常用于在for循环中循环指定的次数。range(stop)range(start,stop[,step])range构造器的参数必须为整数(可以是内...

python常用得内置函数解析——abs()函数

大家号这两天主要是几个常用得内置函数详解详细解析一下Python中非常常用的内置函数abs()。1.函数定义abs(x)是Python的一个内置函数,用于返回一个数的绝对值。参数:x...

如何在Python中获取数字的绝对值?

Python有两种获取数字绝对值的方法:内置abs()函数返回绝对值。math.fabs()函数还返回浮点绝对值。abs()函数获取绝对值内置abs()函数返回绝对值,要使用该函数,只需直接调用:a...

贪心算法变种及Python模板_贪心算法几个经典例子python

贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。以下是贪心算法的主要变种、对应的模板和解决的问题特点。1.区间调度问题问题特点需要从一组区间中选择最大数...

Python倒车请注意!负步长range的10个高能用法,让代码效率翻倍

你是否曾遇到过需要倒着处理数据的情况?面对时间序列、日志文件或者矩阵操作,传统的遍历方式往往捉襟见肘。今天我们就来揭秘Python中那个被低估的功能——range的负步长操作,让你的代码优雅反转!一、...

Python中while循环详解_python怎么while循环

Python中的`while`循环是一种基于条件判断的重复执行结构,适用于不确定循环次数但明确终止条件的场景。以下是详细解析:---###一、基本语法```pythonwhile条件表达式:循环体...

简单的python-核心篇-面向对象编程

在Python中,类本身也是对象,这被称为"元类"。这种设计让Python的面向对象编程具有极大的灵活性。classMyClass:"""一个简单的...

简单的python-python3中的不变的元组

golang中没有内置的元组类型,但是多值返回的处理结果模拟了元组的味道。因此,在golang中"元组”只是一个将多个值(可能是同类型的,也可能是不同类型的)绑定在一起的一种便利方法,通常,也...

python中必须掌握的20个核心函数——sorted()函数

sorted()是Python的内置函数,用于对可迭代对象进行排序,返回一个新的排序后的列表,不修改原始对象。一、sorted()的基本用法1.1方法签名sorted(iterable,*,ke...

12 个 Python 高级技巧,让你的代码瞬间清晰、高效

在日常的编程工作中,我们常常追求代码的精简、优雅和高效。你可能已经熟练掌握了列表推导式(listcomprehensions)、f-string和枚举(enumerate)等常用技巧,但有时仍会觉...

Python的10个进阶技巧:写出更快、更省内存、更优雅的代码

在Python的世界里,我们总是在追求效率和可读性的完美平衡。你不需要一个数百行的新框架来让你的代码变得优雅而快速。事实上,真正能带来巨大提升的,往往是那些看似微小、却拥有高杠杆作用的技巧。这些技巧能...