Commit 19d8e01e11644c66222f137abd05940cbdec0bb6
1 parent
50f94bfe
feat(table-img): support simple show mode and more props
改进TableImg组件,支持简单显示模式以及更多可配置的属性。
Showing
2 changed files
with
82 additions
and
18 deletions
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: '自定义列内容', |