vben
2022-01-24 ecc2135b5e8fdedfebea21b8cd2d80d8d476ec84
提交 | 用户 | age
0f5ddb 1 <template>
J 2   <div class="p-2">
a248e2 3     <div class="p-4 mb-2 bg-white">
0f5ddb 4       <BasicForm @register="registerForm" />
J 5     </div>
a248e2 6     <div class="p-2 bg-white">
628e82 7       <List
0f5ddb 8         :grid="{ gutter: 5, xs: 1, sm: 2, md: 4, lg: 4, xl: 6, xxl: grid }"
J 9         :data-source="data"
10         :pagination="paginationProp"
11       >
12         <template #header>
13           <div class="flex justify-end space-x-2"
14             ><slot name="header"></slot>
15             <Tooltip>
16               <template #title>
17                 <div class="w-50">每行显示数量</div
18                 ><Slider
19                   id="slider"
20                   v-bind="sliderProp"
21                   v-model:value="grid"
22                   @change="sliderChange"
23               /></template>
24               <Button><TableOutlined /></Button>
25             </Tooltip>
26             <Tooltip @click="fetch">
27               <template #title>刷新</template>
28               <Button><RedoOutlined /></Button>
29             </Tooltip>
30           </div>
31         </template>
32         <template #renderItem="{ item }">
33           <ListItem>
34             <Card>
35               <template #title></template>
36               <template #cover>
37                 <div :class="height">
38                   <Image :src="item.imgs[0]" />
39                 </div>
40               </template>
ecc213 41               <template #actions>
0f5ddb 42                 <!--              <SettingOutlined key="setting" />-->
J 43                 <EditOutlined key="edit" />
44                 <Dropdown
45                   :trigger="['hover']"
46                   :dropMenuList="[
47                     {
48                       text: '删除',
49                       event: '1',
50                       popConfirm: {
51                         title: '是否确认删除',
52                         confirm: handleDelete.bind(null, item.id),
53                       },
54                     },
55                   ]"
56                   popconfirm
57                 >
58                   <EllipsisOutlined key="ellipsis" />
59                 </Dropdown>
60               </template>
61
62               <CardMeta>
63                 <template #title>
64                   <TypographyText :content="item.name" :ellipsis="{ tooltip: item.address }" />
65                 </template>
66                 <template #avatar>
67                   <Avatar :src="item.avatar" />
68                 </template>
69                 <template #description>{{ item.time }}</template>
70               </CardMeta>
71             </Card>
72           </ListItem>
73         </template>
628e82 74       </List>
75     </div>
0f5ddb 76   </div>
J 77 </template>
78 <script lang="ts" setup>
79   import { computed, onMounted, ref } from 'vue';
80   import {
81     EditOutlined,
82     EllipsisOutlined,
83     RedoOutlined,
84     TableOutlined,
85   } from '@ant-design/icons-vue';
628e82 86   import { List, Card, Image, Typography, Tooltip, Slider, Avatar } from 'ant-design-vue';
0f5ddb 87   import { Dropdown } from '/@/components/Dropdown';
J 88   import { BasicForm, useForm } from '/@/components/Form';
89   import { propTypes } from '/@/utils/propTypes';
90   import { Button } from '/@/components/Button';
91   import { isFunction } from '/@/utils/is';
92   import { useSlider, grid } from './data';
628e82 93   const ListItem = List.Item;
94   const CardMeta = Card.Meta;
95   const TypographyText = Typography.Text;
0f5ddb 96   // 获取slider属性
J 97   const sliderProp = computed(() => useSlider(4));
98   // 组件接收参数
99   const props = defineProps({
100     // 请求API的参数
101     params: propTypes.object.def({}),
102     //api
103     api: propTypes.func,
104   });
105   //暴露内部方法
106   const emit = defineEmits(['getMethod', 'delete']);
107   //数据
108   const data = ref([]);
109   // 切换每行个数
110   // cover图片自适应高度
111   //修改pageSize并重新请求数据
112
113   const height = computed(() => {
114     return `h-${120 - grid.value * 6}`;
115   });
116   //表单
117   const [registerForm, { validate }] = useForm({
118     schemas: [{ field: 'type', component: 'Input', label: '类型' }],
119     labelWidth: 80,
120     baseColProps: { span: 6 },
121     actionColOptions: { span: 24 },
122     autoSubmitOnEnter: true,
123     submitFunc: handleSubmit,
124   });
125   //表单提交
126   async function handleSubmit() {
127     const data = await validate();
128     await fetch(data);
129   }
130   function sliderChange(n) {
131     pageSize.value = n * 4;
132     fetch();
133   }
134
135   // 自动请求并暴露内部方法
136   onMounted(() => {
137     fetch();
138     emit('getMethod', fetch);
139   });
140
141   async function fetch(p = {}) {
142     const { api, params } = props;
143     if (api && isFunction(api)) {
144       const res = await api({ ...params, page: page.value, pageSize: pageSize.value, ...p });
145       data.value = res.items;
146       total.value = res.total;
147     }
148   }
149   //分页相关
150   const page = ref(1);
151   const pageSize = ref(36);
152   const total = ref(0);
153   const paginationProp = ref({
154     showSizeChanger: false,
155     showQuickJumper: true,
156     pageSize,
157     current: page,
158     total,
159     showTotal: (total) => `总 ${total} 条`,
160     onChange: pageChange,
161     onShowSizeChange: pageSizeChange,
162   });
163
164   function pageChange(p, pz) {
165     page.value = p;
166     pageSize.value = pz;
167     fetch();
168   }
a248e2 169   function pageSizeChange(_current, size) {
0f5ddb 170     pageSize.value = size;
J 171     fetch();
172   }
173
174   async function handleDelete(id) {
175     emit('delete', id);
176   }
177 </script>