导航菜单

Vue

ImageDisplay

简介

ImageDisplay 组件是一个功能丰富的图片展示组件,支持图片网格布局、点击预览、错误处理等功能。适用于需要展示多张图片的场景,如相册、产品图片展示、用户头像列表等。组件支持多种尺寸配置,提供流畅的交互体验和优雅的错误处理。

案例

图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
+2
更多
<template>
  <div>
    <ImageDisplay
      :images="sampleImages"
      size="md"
      :show-preview="true"
      :max-display="4"
      @image-click="handleImageClick"
    />
  </div>
</template>

<script setup lang="ts">
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const sampleImages = [
  // 使用固定的随机种子,确保服务端和客户端一致
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    randomSeed: 'stable1',
  }),
  // 使用固定的标签,确保一致性
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    tag: 'nature',
    randomSeed: 'stable2',
  }),
  // 头像使用固定种子
  getAvatarImage({ width: 200, height: 200, randomSeed: 'user1' }),
  // 产品图片使用固定标签
  getProductImage({
    width: 200,
    height: 200,
    tag: 'tech',
    randomSeed: 'stable3',
  }),
  // 机器人头像使用固定种子
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'robohash',
    randomSeed: 'robot1',
  }),
  // 占位符图片使用固定文本
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'placeholder',
    tag: 'Image 6',
    randomSeed: 'stable4',
  }),
];

const handleImageClick = (imageUrl: string) => {
  console.log('点击了图片:', imageUrl);
};
</script>

Props

images

图片URL数组,必填属性。

图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
+6
更多
<template>
  <div>
    <ImageDisplay
      :images="fewImages"
      size="md"
      :show-preview="true"
      :max-display="6"
    />
  </div>
</template>

<script setup lang="ts">
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const fewImages = [
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    randomSeed: 'stable1',
  }),
  getAvatarImage({ width: 200, height: 200, randomSeed: 'user1' }),
  getProductImage({
    width: 200,
    height: 200,
    tag: 'tech',
    randomSeed: 'stable2',
  }),
];
</script>
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
+6
更多
<template>
  <div>
    <ImageDisplay
      :images="mediumImages"
      size="md"
      :show-preview="true"
      :max-display="6"
    />
  </div>
</template>

<script setup lang="ts">
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const mediumImages = [
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    randomSeed: 'stable1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    tag: 'nature',
    randomSeed: 'stable2',
  }),
  getAvatarImage({ width: 200, height: 200, randomSeed: 'user1' }),
  getProductImage({
    width: 200,
    height: 200,
    tag: 'tech',
    randomSeed: 'stable3',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'robohash',
    randomSeed: 'robot1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'placeholder',
    tag: 'Image 6',
    randomSeed: 'stable4',
  }),
];
</script>
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
+6
更多
<template>
  <div>
    <ImageDisplay
      :images="manyImages"
      size="md"
      :show-preview="true"
      :max-display="6"
    />
  </div>
</template>

<script setup lang="ts">
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const manyImages = [
  // 使用不同的图片服务提供商,但保持稳定的随机种子
  ...Array.from({ length: 3 }, (_, i) =>
    getExampleImage({
      width: 200,
      height: 200,
      provider: 'picsum',
      randomSeed: `stable-picsum-${i + 1}`,
    })
  ),
  ...Array.from({ length: 3 }, (_, i) =>
    getExampleImage({
      width: 200,
      height: 200,
      provider: 'picsum',
      tag: ['nature', 'city', 'food'][i],
      randomSeed: `stable-picsum-${i + 1}`,
    })
  ),
  ...Array.from({ length: 3 }, (_, i) =>
    getAvatarImage({ width: 200, height: 200, randomSeed: `user${i + 1}` })
  ),
  ...Array.from({ length: 3 }, (_, i) =>
    getProductImage({
      width: 200,
      height: 200,
      tag: ['tech', 'fashion', 'home'][i],
      randomSeed: `stable-product-${i + 1}`,
    })
  ),
];
</script>

maxDisplay

最大显示图片数量,超出部分会显示 “+N 更多” 提示。

图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
+3
更多
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
+2
更多
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
<template>
  <div>
    <ImageDisplay
      :images="sampleImages"
      size="md"
      :show-preview="true"
      :max-display="3"
    />
  </div>
</template>

<script setup lang="ts">
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
  getLandscapeImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const sampleImages = [
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    randomSeed: 'stable1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    tag: 'nature',
    randomSeed: 'stable2',
  }),
  getAvatarImage({ width: 200, height: 200, randomSeed: 'user1' }),
  getProductImage({
    width: 200,
    height: 200,
    tag: 'tech',
    randomSeed: 'stable3',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'robohash',
    randomSeed: 'robot1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'placeholder',
    tag: 'Image 6',
    randomSeed: 'stable4',
  }),
];
</script>
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
+3
更多
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
+2
更多
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
<template>
  <div>
    <ImageDisplay
      :images="sampleImages"
      size="md"
      :show-preview="true"
      :max-display="4"
    />
  </div>
</template>

<script setup lang="ts">
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
  getLandscapeImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const sampleImages = [
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    randomSeed: 'stable1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    tag: 'nature',
    randomSeed: 'stable2',
  }),
  getAvatarImage({ width: 200, height: 200, randomSeed: 'user1' }),
  getProductImage({
    width: 200,
    height: 200,
    tag: 'tech',
    randomSeed: 'stable3',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'robohash',
    randomSeed: 'robot1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'placeholder',
    tag: 'Image 6',
    randomSeed: 'stable4',
  }),
];
</script>
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
+3
更多
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
+2
更多
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
<template>
  <div>
    <ImageDisplay
      :images="sampleImages"
      size="md"
      :show-preview="true"
      :max-display="6"
    />
  </div>
</template>

<script setup lang="ts">
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
  getLandscapeImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const sampleImages = [
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    randomSeed: 'stable1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    tag: 'nature',
    randomSeed: 'stable2',
  }),
  getAvatarImage({ width: 200, height: 200, randomSeed: 'user1' }),
  getProductImage({
    width: 200,
    height: 200,
    tag: 'tech',
    randomSeed: 'stable3',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'robohash',
    randomSeed: 'robot1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'placeholder',
    tag: 'Image 6',
    randomSeed: 'stable4',
  }),
];
</script>

showPreview

是否显示预览功能,设置为 false 时点击图片会触发 imageClick 事件。

图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看

点击图片可预览大图

图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看

点击图片会触发 imageClick 事件

<template>
  <div>
    <ImageDisplay
      :images="sampleImages"
      size="md"
      :show-preview="true"
      :max-display="4"
      @image-click="handleImageClick"
    />
    <p class="text-xs text-gray-500 mt-1">点击图片可预览大图</p>
  </div>
</template>

<script setup lang="ts">
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const sampleImages = [
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    randomSeed: 'stable1',
  }),
  getAvatarImage({ width: 200, height: 200, randomSeed: 'user1' }),
  getProductImage({
    width: 200,
    height: 200,
    tag: 'tech',
    randomSeed: 'stable2',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    tag: 'nature',
    randomSeed: 'stable3',
  }),
];

const handleImageClick = (imageUrl: string) => {
  console.log('点击了图片:', imageUrl);
  alert(`点击了图片: ${imageUrl}`);
};
</script>
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看

点击图片可预览大图

图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看

点击图片会触发 imageClick 事件

<template>
  <div>
    <ImageDisplay
      :images="sampleImages"
      size="md"
      :show-preview="false"
      :max-display="4"
      @image-click="handleImageClick"
    />
    <p class="text-xs text-gray-500 mt-1">点击图片会触发 imageClick 事件</p>
  </div>
</template>

<script setup lang="ts">
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const sampleImages = [
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    randomSeed: 'stable1',
  }),
  getAvatarImage({ width: 200, height: 200, randomSeed: 'user1' }),
  getProductImage({
    width: 200,
    height: 200,
    tag: 'tech',
    randomSeed: 'stable2',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    tag: 'nature',
    randomSeed: 'stable3',
  }),
];

const handleImageClick = (imageUrl: string) => {
  console.log('点击了图片:', imageUrl);
  alert(`点击了图片: ${imageUrl}`);
};
</script>

size

图片尺寸大小,支持 sm、md、lg 三种尺寸。

图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
<template>
  <div>
    <ImageDisplay
      :images="sampleImages"
      size="sm"
      :show-preview="true"
      :max-display="6"
    />
  </div>
</template>

<script setup lang="ts">
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
  getLandscapeImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const sampleImages = [
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    randomSeed: 'stable1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    tag: 'nature',
    randomSeed: 'stable2',
  }),
  getAvatarImage({ width: 200, height: 200, randomSeed: 'user1' }),
  getProductImage({
    width: 200,
    height: 200,
    tag: 'tech',
    randomSeed: 'stable3',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'robohash',
    randomSeed: 'robot1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'placeholder',
    tag: 'Image 6',
    randomSeed: 'stable4',
  }),
];
</script>
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
<template>
  <div>
    <ImageDisplay
      :images="sampleImages"
      size="md"
      :show-preview="true"
      :max-display="6"
    />
  </div>
</template>

<script setup lang="ts">
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
  getLandscapeImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const sampleImages = [
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    randomSeed: 'stable1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    tag: 'nature',
    randomSeed: 'stable2',
  }),
  getAvatarImage({ width: 200, height: 200, randomSeed: 'user1' }),
  getProductImage({
    width: 200,
    height: 200,
    tag: 'tech',
    randomSeed: 'stable3',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'robohash',
    randomSeed: 'robot1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'placeholder',
    tag: 'Image 6',
    randomSeed: 'stable4',
  }),
];
</script>
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看
图片 5
点击查看
图片 6
点击查看
<template>
  <div>
    <ImageDisplay
      :images="sampleImages"
      size="lg"
      :show-preview="true"
      :max-display="6"
    />
  </div>
</template>

<script setup lang="ts">
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
  getLandscapeImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const sampleImages = [
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    randomSeed: 'stable1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    tag: 'nature',
    randomSeed: 'stable2',
  }),
  getAvatarImage({ width: 200, height: 200, randomSeed: 'user1' }),
  getProductImage({
    width: 200,
    height: 200,
    tag: 'tech',
    randomSeed: 'stable3',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'robohash',
    randomSeed: 'robot1',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'placeholder',
    tag: 'Image 6',
    randomSeed: 'stable4',
  }),
];
</script>

Events

imageClick

图片点击事件,当 showPreview 为 false 时触发。

事件处理示例

图片 1
点击查看
图片 2
点击查看
图片 3
点击查看
图片 4
点击查看

点击图片查看控制台输出

<template>
  <div class="space-y-4">
    <div>
      <h4 class="text-sm font-medium mb-2">事件处理示例</h4>
      <ImageDisplay
        :images="sampleImages"
        size="md"
        :show-preview="false"
        :max-display="4"
        @image-click="handleImageClick"
      />
      <p class="text-xs text-gray-500 mt-1">点击图片查看控制台输出</p>
    </div>

    <div v-if="clickedImages.length > 0">
      <h4 class="text-sm font-medium mb-2">已点击的图片:</h4>
      <div class="space-y-2">
        <div
          v-for="(image, index) in clickedImages"
          :key="index"
          class="flex items-center space-x-2 p-2 bg-gray-100 rounded"
        >
          <img
            :src="image"
            alt="点击的图片"
            class="w-8 h-8 object-cover rounded"
          />
          <span class="text-sm">{{ image }}</span>
        </div>
      </div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import { ImageDisplay } from '@coffic/cosy-ui/vue';
import {
  getExampleImage,
  getAvatarImage,
  getProductImage,
} from '@coffic/cosy-ui/vue';

// 使用稳定的图片URL,避免水合不匹配
const sampleImages = [
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    randomSeed: 'stable1',
  }),
  getAvatarImage({ width: 200, height: 200, randomSeed: 'user1' }),
  getProductImage({
    width: 200,
    height: 200,
    tag: 'tech',
    randomSeed: 'stable2',
  }),
  getExampleImage({
    width: 200,
    height: 200,
    provider: 'picsum',
    tag: 'nature',
    randomSeed: 'stable3',
  }),
];

const clickedImages = ref<string[]>([]);

const handleImageClick = (imageUrl: string) => {
  console.log('点击了图片:', imageUrl);
  clickedImages.value.push(imageUrl);
};
</script>

搜索