组件上使用 v-for

我们可以直接在组件上使用 v-for,和在一般的元素上使用没有区别 (别忘记提供一个 key):

<MyComponent v-for="item in items" :key="item.id" />

但是,这不会自动将任何数据传递给组件,因为组件有自己独立的作用域。为了将迭代后的数据传递到组件中,我们还需要传递 props:

<MyComponent
  v-for="(item, index) in items"
  :item="item"
  :index="index"
  :key="item.id"
/>

 不自动将 item 注入组件的原因是,这会使组件与 v-for 的工作方式紧密耦合。明确其数据的来源可以使组件在其他情况下重用。

数组变化侦测

变更方法

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

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

替换一个数组

变更方法,顾名思义,就是会对调用它们的原数组进行变更。相对地,也有一些不可变 (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])

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() 的时候务必小心!这两个方法将变更原始数组,计算函数中不应该这么做。请在调用这些方法之前创建一个原数组的副本:

- return numbers.reverse()
+ return [...numbers].reverse()

相关推荐

  1. 组件使用 v-for

    2024-03-29 05:28:05       40 阅读
  2. 组件使用v-model

    2024-03-29 05:28:05       39 阅读
  3. 【Vue技巧】Vue2和Vue3组件使用v-model的实现原理

    2024-03-29 05:28:05       58 阅读
  4. Vue3-在HTML标签、组件标签使用v-model

    2024-03-29 05:28:05       50 阅读
  5. v-if 和 v-for 为什么不建议一起使用

    2024-03-29 05:28:05       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-29 05:28:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-29 05:28:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-29 05:28:05       82 阅读
  4. Python语言-面向对象

    2024-03-29 05:28:05       91 阅读

热门阅读

  1. 前端a4纸尺寸转像素尺寸

    2024-03-29 05:28:05       43 阅读
  2. 浪潮 M5系列服务器IPMI无法监控存储RAID卡问题.

    2024-03-29 05:28:05       106 阅读
  3. Golang基础-5

    2024-03-29 05:28:05       41 阅读
  4. C++之struct和class区别

    2024-03-29 05:28:05       41 阅读
  5. 10.windows ubuntu 组装软件:spades,megahit

    2024-03-29 05:28:05       39 阅读
  6. Ubuntu下显卡超频和提高功耗方式

    2024-03-29 05:28:05       46 阅读
  7. 【PostgreSQL】- 1.1 在 Debian 12 上安装 PostgreSQL 15

    2024-03-29 05:28:05       51 阅读
  8. Docker版本:18.06.1安装

    2024-03-29 05:28:05       35 阅读