Commit 19d8e01e11644c66222f137abd05940cbdec0bb6

Authored by 无木
1 parent 50f94bfe

feat(table-img): support simple show mode and more props

改进TableImg组件,支持简单显示模式以及更多可配置的属性。
src/components/Table/src/components/TableImg.vue
1 1 <template>
2 2 <div
3 3 :class="prefixCls"
4   - class="flex mx-auto items-center"
  4 + class="flex items-center mx-auto"
5 5 v-if="imgList && imgList.length"
6 6 :style="getWrapStyle"
7 7 >
8   - <PreviewGroup>
9   - <template v-for="img in imgList" :key="img">
10   - <Image :width="size" :src="img" />
  8 + <Badge :count="!showBadge || imgList.length == 1 ? 0 : imgList.length" v-if="simpleShow">
  9 + <div class="img-div">
  10 + <PreviewGroup>
  11 + <template v-for="(img, index) in imgList" :key="img">
  12 + <Image
  13 + :width="size"
  14 + :style="{
  15 + display: index === 0 ? '' : 'none !important',
  16 + }"
  17 + :src="srcPrefix + img"
  18 + />
  19 + </template>
  20 + </PreviewGroup>
  21 + </div>
  22 + </Badge>
  23 + <PreviewGroup v-else>
  24 + <template v-for="(img, index) in imgList" :key="img">
  25 + <Image
  26 + :width="size"
  27 + :style="{ 'margin-left': index === 0 ? 0 : margin }"
  28 + :src="srcPrefix + img"
  29 + />
11 30 </template>
12 31 </PreviewGroup>
13 32 </div>
... ... @@ -17,24 +36,30 @@
17 36 import { defineComponent, computed } from 'vue';
18 37 import { useDesign } from '/@/hooks/web/useDesign';
19 38  
20   - import { Image } from 'ant-design-vue';
  39 + import { Image, Badge } from 'ant-design-vue';
21 40 import { propTypes } from '/@/utils/propTypes';
22 41  
23 42 export default defineComponent({
24 43 name: 'TableImage',
25   - components: { Image, PreviewGroup: Image.PreviewGroup },
  44 + components: { Image, PreviewGroup: Image.PreviewGroup, Badge },
26 45 props: {
27 46 imgList: propTypes.arrayOf(propTypes.string),
28 47 size: propTypes.number.def(40),
  48 + // 是否简单显示(只显示第一张图片)
  49 + simpleShow: propTypes.bool,
  50 + // 简单模式下是否显示图片数量的badge
  51 + showBadge: propTypes.bool.def(true),
  52 + // 图片间距
  53 + margin: propTypes.number.def(4),
  54 + // src前缀,将会附加在imgList中每一项之前
  55 + srcPrefix: propTypes.string.def(''),
29 56 },
30 57 setup(props) {
31   - const getWrapStyle = computed(
32   - (): CSSProperties => {
33   - const { size } = props;
34   - const s = `${size}px`;
35   - return { height: s, width: s };
36   - }
37   - );
  58 + const getWrapStyle = computed((): CSSProperties => {
  59 + const { size } = props;
  60 + const s = `${size}px`;
  61 + return { height: s, width: s };
  62 + });
38 63  
39 64 const { prefixCls } = useDesign('basic-table-img');
40 65 return { prefixCls, getWrapStyle };
... ... @@ -53,5 +78,9 @@
53 78 border-radius: 2px;
54 79 }
55 80 }
  81 +
  82 + .img-div {
  83 + display: inline-grid;
  84 + }
56 85 }
57 86 </style>
... ...
src/views/demo/table/CustomerCell.vue
... ... @@ -7,9 +7,31 @@
7 7 {{ record.no }}
8 8 </Tag>
9 9 </template>
  10 + <template #avatar="{ record }">
  11 + <Avatar
  12 + :size="60"
  13 + :src="'http://api.btstu.cn/sjtx/api.php?lx=c1&format=images&id=' + record.id"
  14 + />
  15 + </template>
10 16 <template #img>
11 17 <TableImg
12   - :imgList="['https://picsum.photos/id/66/346/216', 'https://picsum.photos/id/67/346/216']"
  18 + :size="60"
  19 + :simpleShow="true"
  20 + :imgList="[
  21 + 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png?1622962250222',
  22 + 'https://picsum.photos/id/66/346/216',
  23 + 'https://picsum.photos/id/67/346/216',
  24 + ]"
  25 + />
  26 + </template>
  27 + <template #imgs>
  28 + <TableImg
  29 + :size="60"
  30 + :imgList="[
  31 + 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png?1622962250222',
  32 + 'https://picsum.photos/id/66/346/216',
  33 + 'https://picsum.photos/id/67/346/216',
  34 + ]"
13 35 />
14 36 </template>
15 37  
... ... @@ -24,7 +46,7 @@
24 46 <script lang="ts">
25 47 import { defineComponent } from 'vue';
26 48 import { BasicTable, useTable, BasicColumn, TableImg } from '/@/components/Table';
27   - import { Tag } from 'ant-design-vue';
  49 + import { Tag, Avatar } from 'ant-design-vue';
28 50 import { demoListApi } from '/@/api/demo/table';
29 51 const columns: BasicColumn[] = [
30 52 {
... ... @@ -33,6 +55,12 @@
33 55 slots: { customRender: 'id' },
34 56 },
35 57 {
  58 + title: '头像',
  59 + dataIndex: 'avatar',
  60 + width: 100,
  61 + slots: { customRender: 'avatar' },
  62 + },
  63 + {
36 64 title: '分类',
37 65 dataIndex: 'category',
38 66 width: 80,
... ... @@ -46,12 +74,19 @@
46 74 width: 120,
47 75 },
48 76 {
49   - title: '头像',
  77 + title: '图片列表1',
50 78 dataIndex: 'img',
51   - width: 120,
  79 + helpMessage: ['这是简单模式的图片列表', '只会显示一张在表格中', '但点击可预览多张图片'],
  80 + width: 140,
52 81 slots: { customRender: 'img' },
53 82 },
54 83 {
  84 + title: '照片列表2',
  85 + dataIndex: 'imgs',
  86 + width: 160,
  87 + slots: { customRender: 'imgs' },
  88 + },
  89 + {
55 90 title: '地址',
56 91 dataIndex: 'address',
57 92 },
... ... @@ -70,7 +105,7 @@
70 105 },
71 106 ];
72 107 export default defineComponent({
73   - components: { BasicTable, TableImg, Tag },
  108 + components: { BasicTable, TableImg, Tag, Avatar },
74 109 setup() {
75 110 const [registerTable] = useTable({
76 111 title: '自定义列内容',
... ...