Skip to content

列表渲染

v-for

数组 & 对象

template
<!-- 值 -->
<li v-for="item in items">
  {{ item.message }}
</li>

<!-- 值,索引 -->
<li v-for="(item, index) in items">
  {{ item.message }} - {{ index }}
</li>
template
<!-- 值 -->
<li v-for="value in myObject">
  {{ value }}
</li>

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

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

使用解构

template
<li v-for="{ message } in items">
  {{ message }}
</li>

<li v-for="({ message }, index) in items">
  {{ message }} - {{ index }}
</li>

多层嵌套的 v-for

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

of 作为分隔符来替代 in

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

<template> 上的 v-for

html
<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider" role="presentation"></li>
  </template>
</ul>

⭐ 通过 key 管理状态

key 需尽量唯一,且不变。

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

常见问题

v-ifv-for 的优先级?

  • vue2:v-for > v-if
  • vue3: v-if > v-for

所以,在使用的时候不要在同一个元素上使用 v-if 和 v-for,对于开发人员会有”心智负担“。

巧记

  • ​Vue2 像“超市购物车”:先装满所有商品(循环),再逐个检查是否过期(条件判断) → ​ 低效。
  • ​Vue3 像“购物清单筛选”:先确定需要买什么(条件判断),再按清单采购(循环) → ​ 高效。

v-for 中的模板引用

ref 数组并不保证与源数组相同的顺序。

vue
<script setup>
import { ref, useTemplateRef, onMounted } from 'vue'

const list = ref([
  /* ... */
])

const itemRefs = useTemplateRef('items')

onMounted(() => console.log(itemRefs.value))
</script>

<template>
  <ul>
    <li v-for="item in list" ref="items">
      {{ item }}
    </li>
  </ul>
</template>

基于 MIT 许可发布