108 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			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://joeschmoe.io/api/v1/random',
 | |
|     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>
 |