<template> 
 | 
  <div class="image-grid-wrapper"> 
 | 
    <nut-grid square :gutter="gutter" :column-num="columnNum" :center="false"> 
 | 
      <nut-grid-item 
 | 
        v-for="item in images" 
 | 
        :key="item.src" 
 | 
        class="image-grid-file-list-item-wrapper" 
 | 
      > 
 | 
        <div class="image-grid-file-list-item img-grid"> 
 | 
          <PreviewImage 
 | 
            :src="setOSSLink(item.src)" 
 | 
            class="image-grid-img" 
 | 
            wrapperClassName="image-grid-img-wrapper" 
 | 
            :urls="previewUrls" 
 | 
          /> 
 | 
        </div> 
 | 
      </nut-grid-item> 
 | 
    </nut-grid> 
 | 
    <!-- <div v-else-if="images.length === 1" class="image-grid-file-list-item img"> 
 | 
      <AutoWidthImage 
 | 
        wrapperClassName="image-normal-img" 
 | 
        openScale 
 | 
        :src="setOSSLink(images[0].src)" 
 | 
      /> 
 | 
    </div> --> 
 | 
  </div> 
 | 
</template> 
 | 
  
 | 
<script setup lang="ts"> 
 | 
import AutoWidthImage from './AutoWidthImage.vue'; 
 | 
import PreviewImage from './PreviewImage.vue'; 
 | 
import { setOSSLink } from '@12333/utils'; 
 | 
import { computed } from 'vue'; 
 | 
  
 | 
defineOptions({ 
 | 
  name: 'ImageGrid', 
 | 
}); 
 | 
  
 | 
type Props = { 
 | 
  imageList: { 
 | 
    fileUrl?: string; 
 | 
    [key: string]: any; 
 | 
  }[]; 
 | 
  gutter?: number; 
 | 
  columnNum?: number; 
 | 
}; 
 | 
  
 | 
const props = withDefaults(defineProps<Props>(), { 
 | 
  gutter: 20, 
 | 
  columnNum: 3, 
 | 
}); 
 | 
  
 | 
const images = computed(() => 
 | 
  props.imageList.map((item) => ({ 
 | 
    src: setOSSLink(item.fileUrl), 
 | 
  })) 
 | 
); 
 | 
  
 | 
const previewUrls = computed(() => images.value.map((item) => item.src)); 
 | 
</script> 
 | 
  
 | 
<style lang="scss"> 
 | 
@import '@/styles/common.scss'; 
 | 
  
 | 
.image-grid-wrapper { 
 | 
  // margin: -10px; 
 | 
  // display: flex; 
 | 
  // flex-wrap: wrap; 
 | 
  margin-bottom: 20px; 
 | 
  width: 100%; 
 | 
  
 | 
  .nut-grid { 
 | 
    padding: 0 !important; 
 | 
    width: 100%; 
 | 
  } 
 | 
  
 | 
  .image-grid-file-list-item-wrapper { 
 | 
    .nut-grid-item__content--square { 
 | 
      padding: 0; 
 | 
      border: none; 
 | 
      display: block; 
 | 
    } 
 | 
  } 
 | 
  
 | 
  .image-grid-file-list-item { 
 | 
    padding: 5px; 
 | 
    box-sizing: border-box; 
 | 
  
 | 
    &.video { 
 | 
      // width: 300px; 
 | 
      // height: 150px; 
 | 
      max-width: 66%; 
 | 
    } 
 | 
  
 | 
    &.img { 
 | 
      // width: 450px; 
 | 
      // max-height: 400px; 
 | 
      overflow: hidden; 
 | 
      // height: auto; 
 | 
      // height: 150px; 
 | 
      width: 66%; 
 | 
      display: flex; 
 | 
    } 
 | 
  
 | 
    &.img-grid { 
 | 
      // width: 33%; 
 | 
      width: 100%; 
 | 
      height: 100%; 
 | 
    } 
 | 
  
 | 
    .image-grid-img-wrapper { 
 | 
      overflow: hidden; 
 | 
      @include hairline-surround; 
 | 
      box-sizing: border-box; 
 | 
      border-radius: 8px; 
 | 
    } 
 | 
  
 | 
    .image-grid-img { 
 | 
      width: 100%; 
 | 
      height: 100%; 
 | 
      /* object-fit: cover; */ 
 | 
    } 
 | 
  
 | 
    .image-normal-img { 
 | 
      @include hairline-surround; 
 | 
      width: auto; 
 | 
      height: auto; 
 | 
    } 
 | 
  
 | 
    .image-grid-video { 
 | 
      width: 100%; 
 | 
      height: 100%; 
 | 
    } 
 | 
  } 
 | 
} 
 | 
</style> 
 |