Skip to content

列表渲染

基于数组的渲染

vue
<template>
    <div class="div-box">
        <!--  v-for in -->
        <ul>
            <li v-for="(item, index) in items" :key="item.id">
                {{ item.text }} - {{ index }}
            </li>
        </ul>

        <!-- v-for of -->
        <ul>
            <li v-for="item of items" :key="item.id">
                {{ item.text }}
            </li>
        </ul>

        <!-- v-for destructuring -->
        <ul>
            <li v-for="({ id, text }, index) in items" :key="id">
                {{ text }} - {{ index }}
            </li>
        </ul>
    </div>
</template>

<script setup lang="ts">
const items = [
    { id: 1, text: 'Item 1' },
    { id: 2, text: 'Item 2' },
    { id: 3, text: 'Item 3' },
    { id: 4, text: 'Item 4' },
    { id: 5, text: 'Item 5' },
];
</script>

基于对象的渲染

vue
<template>
    <div class="div-box">
        <!--  v-for in -->
        <ul>
            <li v-for="(value, key) in myObject" :key="key">
                {{ key }}: {{ value }}
            </li>
        </ul>

        <!--  v-for in with index -->
        <ul>
            <li v-for="(value, key, index) in myObject" :key="key">
                {{ key }}: {{ value }} - {{ index }}
            </li>
        </ul>
    </div>
</template>

<script setup lang="ts">
const myObject = {
    a: 1,
    b: 2,
    c: 3,
};
</script>

基于范围的渲染

v-for 可以直接接受一个整数值,表示渲染多少次,n 的初值从 1 开始。

vue
<template>
    <div class="div-box">
        <!-- 12345678910 -->
        <span v-for="n in 10">{{ n }}</span>
    </div>
</template>

template 上的 v-for

如果需要渲染多个元素,可以将它们包装在一个 <template> 元素内,并使用 v-for 来渲染一个包含多个元素的块。

vue
<template>
    <div class="div-box">
        <template v-for="item in items">
            <li>{{ item.role }}</li>
            <li>{{ item.msg }}</li>
        </template>
    </div>
</template>

<script setup lang="ts">
const items = [
    { role: 'Admin', msg: 'Welcome to the admin page' },
    { role: 'User', msg: 'Welcome to the user page' },
    { role: 'Guest', msg: 'Welcome to the guest page' },
];
</script>

v-for 与 v-if

在同一个元素上使用 v-ifv-for 时,v-ifv-for 优先级更高,这意味着 v-if 将无法访问到 v-for 中的变量。

推荐的做法是在外先包装一层 <template> 元素,在其上使用 v-for,然后在内部使用 v-if

vue
<template>
    <div class="div-box">
        <template v-for="todo in todos">
            <li>
                <span v-if="todo.isComplete">✔️</span>
                <span v-else>❌</span>
                {{ todo.name }}
            </li>
        </template>
    </div>
</template>

<script setup lang="ts">
const todos = [
    { name: 'Learn Vue 3', isComplete: false },
    { name: 'Learn Vue Router', isComplete: true },
    { name: 'Learn Vuex', isComplete: false },
];
</script>