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 <template> 1 <template>
2 <div 2 <div
3 :class="prefixCls" 3 :class="prefixCls"
4 - class="flex mx-auto items-center" 4 + class="flex items-center mx-auto"
5 v-if="imgList && imgList.length" 5 v-if="imgList && imgList.length"
6 :style="getWrapStyle" 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 </template> 30 </template>
12 </PreviewGroup> 31 </PreviewGroup>
13 </div> 32 </div>
@@ -17,24 +36,30 @@ @@ -17,24 +36,30 @@
17 import { defineComponent, computed } from 'vue'; 36 import { defineComponent, computed } from 'vue';
18 import { useDesign } from '/@/hooks/web/useDesign'; 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 import { propTypes } from '/@/utils/propTypes'; 40 import { propTypes } from '/@/utils/propTypes';
22 41
23 export default defineComponent({ 42 export default defineComponent({
24 name: 'TableImage', 43 name: 'TableImage',
25 - components: { Image, PreviewGroup: Image.PreviewGroup }, 44 + components: { Image, PreviewGroup: Image.PreviewGroup, Badge },
26 props: { 45 props: {
27 imgList: propTypes.arrayOf(propTypes.string), 46 imgList: propTypes.arrayOf(propTypes.string),
28 size: propTypes.number.def(40), 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 setup(props) { 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 const { prefixCls } = useDesign('basic-table-img'); 64 const { prefixCls } = useDesign('basic-table-img');
40 return { prefixCls, getWrapStyle }; 65 return { prefixCls, getWrapStyle };
@@ -53,5 +78,9 @@ @@ -53,5 +78,9 @@
53 border-radius: 2px; 78 border-radius: 2px;
54 } 79 }
55 } 80 }
  81 +
  82 + .img-div {
  83 + display: inline-grid;
  84 + }
56 } 85 }
57 </style> 86 </style>
src/views/demo/table/CustomerCell.vue
@@ -7,9 +7,31 @@ @@ -7,9 +7,31 @@
7 {{ record.no }} 7 {{ record.no }}
8 </Tag> 8 </Tag>
9 </template> 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 <template #img> 16 <template #img>
11 <TableImg 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 </template> 36 </template>
15 37
@@ -24,7 +46,7 @@ @@ -24,7 +46,7 @@
24 <script lang="ts"> 46 <script lang="ts">
25 import { defineComponent } from 'vue'; 47 import { defineComponent } from 'vue';
26 import { BasicTable, useTable, BasicColumn, TableImg } from '/@/components/Table'; 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 import { demoListApi } from '/@/api/demo/table'; 50 import { demoListApi } from '/@/api/demo/table';
29 const columns: BasicColumn[] = [ 51 const columns: BasicColumn[] = [
30 { 52 {
@@ -33,6 +55,12 @@ @@ -33,6 +55,12 @@
33 slots: { customRender: 'id' }, 55 slots: { customRender: 'id' },
34 }, 56 },
35 { 57 {
  58 + title: '头像',
  59 + dataIndex: 'avatar',
  60 + width: 100,
  61 + slots: { customRender: 'avatar' },
  62 + },
  63 + {
36 title: '分类', 64 title: '分类',
37 dataIndex: 'category', 65 dataIndex: 'category',
38 width: 80, 66 width: 80,
@@ -46,12 +74,19 @@ @@ -46,12 +74,19 @@
46 width: 120, 74 width: 120,
47 }, 75 },
48 { 76 {
49 - title: '头像', 77 + title: '图片列表1',
50 dataIndex: 'img', 78 dataIndex: 'img',
51 - width: 120, 79 + helpMessage: ['这是简单模式的图片列表', '只会显示一张在表格中', '但点击可预览多张图片'],
  80 + width: 140,
52 slots: { customRender: 'img' }, 81 slots: { customRender: 'img' },
53 }, 82 },
54 { 83 {
  84 + title: '照片列表2',
  85 + dataIndex: 'imgs',
  86 + width: 160,
  87 + slots: { customRender: 'imgs' },
  88 + },
  89 + {
55 title: '地址', 90 title: '地址',
56 dataIndex: 'address', 91 dataIndex: 'address',
57 }, 92 },
@@ -70,7 +105,7 @@ @@ -70,7 +105,7 @@
70 }, 105 },
71 ]; 106 ];
72 export default defineComponent({ 107 export default defineComponent({
73 - components: { BasicTable, TableImg, Tag }, 108 + components: { BasicTable, TableImg, Tag, Avatar },
74 setup() { 109 setup() {
75 const [registerTable] = useTable({ 110 const [registerTable] = useTable({
76 title: '自定义列内容', 111 title: '自定义列内容',