1. 使用 v-for
指令(基本用法)
这是最常用的方式,通过 v-for
指令可以遍历列表数据,并为每个数据项生成对应的列表项元素。
假设你有一个名为 listData
的列表数据,数据项是一些简单的字符串,示例如下:
html
复制
<template>
<ul>
<li v-for="(item, index) in listData" :key="index">{{ item }}</li>
</ul>
</template>
<script setup>
import { ref } from 'vue';
const listData = ref([
'苹果',
'香蕉',
'橙子',
'草莓'
]);
</script>
在上述代码中:
- 在模板部分,使用
v-for
指令遍历listData
。(item, index)
分别表示列表中的每个数据项和其对应的索引。:key
属性绑定了每个列表项的唯一标识,这里使用索引作为键值(在实际应用中,如果数据有唯一的id
等属性,建议使用该属性作为键值会更合适)。然后通过插值表达式{{ item }}
将每个数据项展示在对应的列表项<li>
元素中。 - 在脚本部分,通过
ref
创建了一个响应式的列表数据listData
,并初始化了一些示例数据。
2. 使用 v-for
展示对象列表数据
如果列表数据是对象数组,例如每个数据项包含多个属性,展示方式类似,但可以根据需要展示对象的不同属性。
假设 listData
是一个包含对象的列表,每个对象有 name
和 description
两个属性,示例如下:
html
复制
<template>
<ul>
<li v-for="(item, index) in listData" :key="index">
<span>{{ item.name }}</span> - <span>{{ item.description }}</span>
</li>
</ul>
</template>
<script setup>
import { ref } from 'vue';
const listData = ref([
{ name: '苹果', description: '一种常见的水果,红色,口感酸甜' },
{ name: '香蕉', description: '黄色的长条形水果,软糯香甜' },
{ name: '橙子', description: '橙色的圆形水果,多汁味甜' },
{ name: '草莓', description: '红色的小巧水果,味道鲜美' }
]);
</script>
这里在模板部分的 <li>
元素中,通过 {{ item.name }}
和 {{ item.description }}
分别展示了每个对象数据项的 name
和 description
属性。
3. 使用组件化方式展示列表数据(可复用性更强)
对于更复杂的列表展示需求,或者需要在多个地方复用列表展示逻辑,可以创建一个专门的组件来展示列表数据。
首先创建一个名为 ListComponent.vue
的组件:
html
复制
<template>
<ul>
<li v-for="(item, index) in listData" :key="index">
<slot :item="item" :index="index"></slot>
</li>
</ul>
</template>
<script setup>
import { defineProps } from 'vue';
const props = defineProps({
listData: Array
});
</script>
在这个组件中:
- 通过
defineProps
定义了一个名为listData
的属性,用于接收从父组件传递过来的列表数据。 - 在模板部分,使用
v-for
遍历listData
,并通过<slot>
元素将每个数据项item
和其索引index
作为属性传递给插槽内容,以便在使用该组件时可以根据具体需求定制每个列表项的展示内容。
然后在父组件中使用这个组件来展示列表数据:
html
复制
<template>
<ListComponent :listData="listData">
<template v-slot:default="slotProps">
<span>{{ slotProps.item.name }}</span> - <span>{{ slotProps.item.description }}</span>
</template>
</ListComponent>
</template>
<script setup>
import { ref } from 'vue';
import ListComponent from './ListComponent.vue';
const listData = ref([
{ name: '苹果', description: '一种常见的水果,红色,口感酸甜' },
{ name: '香蕉', description: '黄色的长条形水果,软糯香甜' },
{ name: '橙子', description: '橙色的圆形水果,多汁味甜' },
{ name: '草莓', description: '红色的小巧水果,味道鲜美' }
]);
</script>
在父组件中:
- 首先导入了
ListComponent
组件。 - 通过
:listData="listData"
将本地的listData
数据传递给ListComponent
组件。 - 使用
<template v-slot:default="slotProps">
定义了默认插槽内容,在插槽内容中通过{{ slotProps.item.name }}
和{{ slotProps.item.description }}
展示了每个数据项的name
和description
属性,这里的slotProps
就是从ListComponent
组件的插槽传递过来的包含数据项和索引的对象。
通过以上几种方法,你可以根据具体的列表数据结构和展示需求,在 Vue 3 中合适地将列表数据按照列表的样子展示出来。