ShowImageList.vue 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <template>
  2. <span v-if="!images||images.length==0">无图片</span>
  3. <div v-else-if="images" class="image-list">
  4. <a-image
  5. v-for="(image, k) in (showAll ? images : images.filter((_: unknown, i: number) => i < maxCount))"
  6. :key="k"
  7. :width="imgSize"
  8. :height="imgSize"
  9. :src="image"
  10. :fallback="failImage"
  11. />
  12. <div v-if="images.length > maxCount" class="overflow-count" :style="{
  13. width: `${imgSize}px`,
  14. height: `${imgSize}px`,
  15. lineHeight: `${imgSize}px`,
  16. }" @click="showAll=!showAll">
  17. {{showAll ? '折叠' : `+${images.length - maxCount}` }}
  18. </div>
  19. </div>
  20. </template>
  21. <script lang="ts">
  22. import { defineComponent, type PropType } from "vue";
  23. export default defineComponent({
  24. name: "ShowImageList",
  25. props: {
  26. images: {
  27. type: Object as PropType<Array<string>>,
  28. default: null,
  29. },
  30. size: {
  31. type: [Number,String],
  32. default: 30,
  33. },
  34. maxCount: {
  35. type: Number,
  36. default: 5,
  37. },
  38. failImage: {
  39. default: () => require('@/assets/images/failed.svg'),
  40. type: String
  41. },
  42. },
  43. computed: {
  44. imgSize() : number {
  45. if (typeof this.size === 'string')
  46. switch(this.size) {
  47. case 'default': return 45;
  48. case 'middle': return 30;
  49. case 'small': return 20;
  50. }
  51. return this.size as number;
  52. },
  53. },
  54. data() {
  55. return {
  56. showAll: false,
  57. };
  58. },
  59. });
  60. </script>
  61. <style lang="scss">
  62. .image-list {
  63. position: relative;
  64. display: flex;
  65. flex-direction: row;
  66. align-items: center;
  67. flex-wrap: wrap;
  68. .overflow-count {
  69. color: #fff;
  70. background-color: rgba(0,0,0,0.5);
  71. text-align: center;
  72. cursor: pointer;
  73. }
  74. .ant-image {
  75. background-color: #ececec;
  76. overflow: hidden;
  77. display: flex;
  78. justify-content: center;
  79. align-items: center;
  80. }
  81. }
  82. </style>