List 列表
通用列表。
何时使用
最基础的列表展示,可承载文字、列表、图片、段落,常用于后台数据展示页面。
代码演示
基础列表。
<template>
<a-list item-layout="horizontal" :data-source="data">
<template #renderItem="{ item }">
<a-list-item>
<a-list-item-meta
description="Ant Design, a design language for background applications, is refined by Ant UED Team"
>
<template #title>
<a href="https://www.antdv.com/">{{ item.title }}</a>
</template>
<template #avatar>
<a-avatar src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png" />
</template>
</a-list-item-meta>
</a-list-item>
</template>
</a-list>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
interface DataItem {
title: string;
}
const data: DataItem[] = [
{
title: 'Ant Design Title 1',
},
{
title: 'Ant Design Title 2',
},
{
title: 'Ant Design Title 3',
},
{
title: 'Ant Design Title 4',
},
];
export default defineComponent({
setup() {
return {
data,
};
},
});
</script>
Small Size
Default Size
Large Size
列表拥有大、中、小三种尺寸。 通过设置 size
为 large
small
分别把按钮设为大、小尺寸。若不设置 size
,则尺寸为中。 可通过设置 header
和 footer
,来自定义列表头部和尾部。
<template>
<h3 :style="{ margin: '16px 0' }">Small Size</h3>
<a-list size="small" bordered :data-source="data">
<template #renderItem="{ item }">
<a-list-item>{{ item }}</a-list-item>
</template>
<template #header>
<div>Header</div>
</template>
<template #footer>
<div>Footer</div>
</template>
</a-list>
<h3 :style="{ marginBottom: '16px' }">Default Size</h3>
<a-list bordered :data-source="data">
<template #renderItem="{ item }">
<a-list-item>{{ item }}</a-list-item>
</template>
<template #header>
<div>Header</div>
</template>
<template #footer>
<div>Footer</div>
</template>
</a-list>
<h3 :style="{ margin: '16px 0' }">Large Size</h3>
<a-list size="large" bordered :data-source="data">
<template #renderItem="{ item }">
<a-list-item>{{ item }}</a-list-item>
</template>
<template #header>
<div>Header</div>
</template>
<template #footer>
<div>Footer</div>
</template>
</a-list>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
const data: string[] = [
'Racing car sprays burning fuel into crowd.',
'Japanese princess to wed commoner.',
'Australian walks 100km after outback crash.',
'Man charged over missing wedding girl.',
'Los Angeles battles huge wildfires.',
];
export default defineComponent({
setup() {
return {
data,
};
},
});
</script>
可通过 loadMore
属性实现加载更多功能。
<template>
<a-list
class="demo-loadmore-list"
:loading="loading"
item-layout="horizontal"
:data-source="data"
>
<template #loadMore>
<div
v-if="showLoadingMore"
:style="{ textAlign: 'center', marginTop: '12px', height: '32px', lineHeight: '32px' }"
>
<a-spin v-if="loadingMore" />
<a-button v-else @click="onLoadMore">loading more</a-button>
</div>
</template>
<template #renderItem="{ item }">
<a-list-item>
<template #actions>
<a>edit</a>
<a>more</a>
</template>
<a-list-item-meta
description="Ant Design, a design language for background applications, is refined by Ant UED Team"
>
<template #title>
<a href="https://www.antdv.com/">{{ item.name.last }}</a>
</template>
<template #avatar>
<a-avatar src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png" />
</template>
</a-list-item-meta>
<div>content</div>
</a-list-item>
</template>
</a-list>
</template>
<script lang="ts">
import axios, { AxiosResponse } from 'axios';
import { defineComponent, ref, onMounted, nextTick } from 'vue';
const fakeDataUrl = 'https://randomuser.me/api/?results=5&inc=name,gender,email,nat&noinfo';
export default defineComponent({
setup() {
const loading = ref<boolean>(true);
const loadingMore = ref<boolean>(false);
const showLoadingMore = ref<boolean>(true);
const data = ref([]);
onMounted(() => {
getData((res: AxiosResponse) => {
loading.value = false;
data.value = res.data.results;
});
});
const getData = async (callback: (r: AxiosResponse) => void) => {
const res = await axios({
url: fakeDataUrl,
method: 'get',
});
callback(res);
};
const onLoadMore = () => {
loadingMore.value = true;
getData((res: AxiosResponse) => {
data.value = data.value.concat(res.data.results);
loadingMore.value = false;
nextTick(() => {
window.dispatchEvent(new Event('resize'));
});
});
};
return {
loading,
loadingMore,
showLoadingMore,
data,
onLoadMore,
};
},
});
</script>
<style scoped>
.demo-loadmore-list {
min-height: 350px;
}
</style>
通过设置 itemLayout
属性为 vertical
可实现竖排列表样式。
<template>
<a-list item-layout="vertical" size="large" :pagination="pagination" :data-source="listData">
<template #footer>
<div>
<b>ant design vue</b>
footer part
</div>
</template>
<template #renderItem="{ item }">
<a-list-item key="item.title">
<template #actions>
<span v-for="{ type, text } in actions" :key="type">
<component v-bind:is="type" style="margin-right: 8px" />
{{ text }}
</span>
</template>
<template #extra>
<img
width="272"
alt="logo"
src="https://gw.alipayobjects.com/zos/rmsportal/mqaQswcyDLcXyDKnZfES.png"
/>
</template>
<a-list-item-meta :description="item.description">
<template #title>
<a :href="item.href">{{ item.title }}</a>
</template>
<template #avatar><a-avatar :src="item.avatar" /></template>
</a-list-item-meta>
{{ item.content }}
</a-list-item>
</template>
</a-list>
</template>
<script lang="ts">
import { StarOutlined, LikeOutlined, MessageOutlined } from '@ant-design/icons-vue';
import { defineComponent } from 'vue';
const listData: Record<string, string>[] = [];
for (let i = 0; i < 23; i++) {
listData.push({
href: 'https://www.antdv.com/',
title: `ant design vue part ${i}`,
avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png',
description:
'Ant Design, a design language for background applications, is refined by Ant UED Team.',
content:
'We supply a series of design principles, practical patterns and high quality design resources (Sketch and Axure), to help people create their product prototypes beautifully and efficiently.',
});
}
export default defineComponent({
components: {
StarOutlined,
LikeOutlined,
MessageOutlined,
},
setup() {
const pagination = {
onChange: (page: number) => {
console.log(page);
},
pageSize: 3,
};
const actions: Record<string, string>[] = [
{ type: 'StarOutlined', text: '156' },
{ type: 'LikeOutlined', text: '156' },
{ type: 'MessageOutlined', text: '2' },
];
return {
listData,
pagination,
actions,
};
},
});
</script>
可以通过设置 List
的 grid
属性来实现栅格列表,column
可设置期望显示的列数。
<template>
<a-list :grid="{ gutter: 16, column: 4 }" :data-source="data">
<template #renderItem="{ item }">
<a-list-item>
<a-card :title="item.title">Card content</a-card>
</a-list-item>
</template>
</a-list>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
interface DataItem {
title: string;
}
const data: DataItem[] = [
{
title: 'Title 1',
},
{
title: 'Title 2',
},
{
title: 'Title 3',
},
{
title: 'Title 4',
},
];
export default defineComponent({
setup() {
return {
data,
};
},
});
</script>
响应式的栅格列表。尺寸与 Layout Grid 保持一致。
<template>
<a-list :grid="{ gutter: 16, xs: 1, sm: 2, md: 4, lg: 4, xl: 6, xxl: 3 }" :data-source="data">
<template #renderItem="{ item }">
<a-list-item>
<a-card :title="item.title">Card content</a-card>
</a-list-item>
</template>
</a-list>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
interface DataItem {
title: string;
}
const data: DataItem[] = [
{
title: 'Title 1',
},
{
title: 'Title 2',
},
{
title: 'Title 3',
},
{
title: 'Title 4',
},
{
title: 'Title 5',
},
{
title: 'Title 6',
},
];
export default defineComponent({
setup() {
return {
data,
};
},
});
</script>
API
List
参数 | 说明 | 类型 | 默认值 | 版本 |
---|---|---|---|---|
bordered | 是否展示边框 | boolean | false | |
footer | 列表底部 | string|slot | - | |
grid | 列表栅格配置 | object | - | |
header | 列表头部 | string|slot | - | |
itemLayout | 设置 List.Item 布局, 设置成 vertical 则竖直样式显示, 默认横排 | string | - | |
loading | 当卡片内容还在加载中时,可以用 loading 展示一个占位 | boolean|object | false | |
loadMore | 加载更多 | string|slot | - | |
locale | 默认文案设置,目前包括空数据文案 | object | emptyText: ‘暂无数据’ | |
pagination | 对应的 pagination 配置, 设置 false 不显示 | boolean|object | false | |
size | list 的尺寸 | default | middle | small | default | |
split | 是否展示分割线 | boolean | true | |
dataSource | 列表数据源 | any[] | - | 1.5.0 |
renderItem | 自定义Item 函数,也可使用 #renderItem=”{item, index}” | ({item, index}) => vNode | - | |
rowKey | 各项 key 的取值,可以是字符串或一个函数 | item => string|number |
pagination
分页的配置项。
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
position | 指定分页显示的位置 | ‘top’ | ‘bottom’ | ‘both’ | ‘bottom’ |
更多配置项,请查看 Pagination
。
List grid props
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
column | 列数 | number oneOf [ 1, 2, 3, 4, 6, 8, 12, 24] | - |
gutter | 栅格间隔 | number | 0 |
xs | <576px 展示的列数 | number | - |
sm | ≥576px 展示的列数 | number | - |
md | ≥768px 展示的列数 | number | - |
lg | ≥992px 展示的列数 | number | - |
xl | ≥1200px 展示的列数 | number | - |
xxl | ≥1600px 展示的列数 | number | - |
List.Item
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
actions | 列表操作组,根据 itemLayout 的不同, 位置在卡片底部或者最右侧 | Array<vNode>/ | slot |
extra | 额外内容, 通常用在 itemLayout 为 vertical 的情况下, 展示右侧内容; horizontal 展示在列表元素最右侧 | string|slot | - |
List.Item.Meta
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
avatar | 列表元素的图标 | slot | - |
description | 列表元素的描述内容 | string|slot | - |
title | 列表元素的标题 | string|slot | - |