ant-design-vue/components/skeleton/demo/list.vue

108 lines
2.7 KiB
Vue

<docs>
---
order: 5
title:
zh-CN: 列表
en-US: List
---
## zh-CN
在列表组件中使用加载占位符
## en-US
Use skeleton in list component.
</docs>
<template>
<div>
<a-switch :checked="!loading" @change="onChange" />
<a-list item-layout="vertical" size="large" :data-source="listData">
<template #renderItem="{ item }">
<a-list-item key="item.title">
<template v-if="!loading" #actions>
<span v-for="{ type, text } in actions" :key="type">
<component :is="type" style="margin-right: 8px"></component>
{{ text }}
</span>
</template>
<template #extra>
<img
v-if="!loading"
width="272"
alt="logo"
src="https://gw.alipayobjects.com/zos/rmsportal/mqaQswcyDLcXyDKnZfES.png"
/>
</template>
<a-skeleton :loading="loading" active avatar>
<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-skeleton>
</a-list-item>
</template>
</a-list>
</div>
</template>
<script lang="ts">
import { StarOutlined, LikeOutlined, MessageOutlined } from '@ant-design/icons-vue';
import { defineComponent, ref } from 'vue';
interface DataItem {
href: string;
title: string;
avatar: string;
description: string;
content: string;
}
const listData: DataItem[] = [];
for (let i = 0; i < 3; 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 loading = ref<boolean>(true);
const actions = [
{ type: 'star-outlined', text: '156' },
{ type: 'like-outlined', text: '156' },
{ type: 'message-outlined', text: '2' },
];
const onChange = (checked: boolean) => {
loading.value = !checked;
};
return {
loading,
listData,
actions,
onChange,
};
},
});
</script>
<style scoped>
.skeleton-demo {
border: 1px solid #f4f4f4;
}
</style>