import { Image, PreviewGroup, ImageViewer } from "@reglow/reui";
加载失败提示等文案默认跟随全局语言(zh-CN / zh-TW / en-US)。
单击图像可以放大显示。
<script setup>
import { Image } from "@reglow/reui";
</script>
<template>
<Image
:width="200"
height="200"
src="https://example.com/image.jpg"
alt="图片描述"
/>
</template>
通过 placeholder 属性设置占位符。设为 true 时显示进度动画。
<script setup>
import { ref } from "vue";
import { Image } from "@reglow/reui";
const timestamp = ref("");
</script>
<template>
<Image
:src="`/big-image.png?${timestamp}`"
:width="300"
:height="200"
:placeholder="true"
/>
<button @click="timestamp = Date.now()">重新加载</button>
</template>
传入自定义 VNode 作为占位符。
<script setup>
import { h } from "vue";
import { Image } from "@reglow/reui";
import { Loader2 } from "lucide-vue-next";
const placeholder = h(Loader2, {
class: "size-6 animate-spin text-muted-foreground",
});
</script>
<template>
<Image
src="/image.jpg"
:width="200"
:height="200"
:placeholder="placeholder"
/>
</template>
加载失败显示图像占位符,可通过 fallback 设置容错图片地址。
<template>
<!-- 默认失败占位 -->
<Image src="/error.jpg" :width="200" :height="200" />
<!-- 自定义容错地址 -->
<Image src="/error.jpg" fallback="/fallback.png" :width="200" :height="200" />
</template>
使用 PreviewGroup 包裹 Image,点击可预览多张图片。
<script setup>
import { Image, PreviewGroup } from "@reglow/reui";
const srcList = ["/image1.jpg", "/image2.jpg", "/image3.jpg"];
</script>
<template>
<PreviewGroup>
<div class="flex gap-2">
<Image
v-for="src in srcList"
:key="src"
:src="src"
:width="200"
:height="200"
/>
</div>
</PreviewGroup>
</template>
通过 items 属性直接传入图片数组。
<script setup>
import { Image, PreviewGroup } from "@reglow/reui";
const items = ["/image1.jpg", "/image2.jpg", "/image3.jpg", "/image4.jpg"];
</script>
<template>
<PreviewGroup :items="items" :preview="{ current: 0 }">
<Image :src="items[0]" :width="200" :height="200" />
</PreviewGroup>
</template>
通过 preview.src 设置不同的预览大图。
<template>
<Image
src="/thumbnail.jpeg"
:width="300"
:height="200"
:preview="{ src: '/full-size.png' }"
/>
</template>
通过 preview.open 和 preview.onOpenChange 控制预览。
<script setup>
import { ref } from "vue";
import { Image } from "@reglow/reui";
const open = ref(false);
</script>
<template>
<button @click="open = true">打开预览</button>
<button @click="open = false">关闭预览</button>
<Image
src="/image.jpg"
:width="200"
:height="200"
:preview="{
open: open,
onOpenChange: (val) => (open = val),
}"
/>
</template>
通过 preview.scaleStep 设置缩放步长。
<template>
<Image
src="/image.jpg"
:width="200"
:height="200"
:preview="{
scaleStep: 0.2,
minScale: 1,
maxScale: 10,
}"
/>
</template>
通过 preview.mask 设置预览遮罩效果。
<template>
<!-- 默认遮罩 -->
<Image
src="/image.jpg"
:width="200"
:height="200"
:preview="{ mask: true }"
/>
<!-- 模糊遮罩 -->
<Image
src="/image.jpg"
:width="200"
:height="200"
:preview="{ mask: { blur: true, closable: true } }"
/>
<!-- 无遮罩 -->
<Image
src="/image.jpg"
:width="200"
:height="200"
:preview="{ mask: false }"
/>
</template>
设置 preview 为 false 禁用预览。
<template>
<Image src="/image.jpg" :width="200" :height="200" :preview="false" />
</template>
ImageViewer 可单独使用。
<script setup>
import { ref } from "vue";
import { ImageViewer } from "@reglow/reui";
const open = ref(false);
const srcList = ["/image1.jpg", "/image2.jpg", "/image3.jpg"];
</script>
<template>
<button @click="open = true">预览</button>
<ImageViewer v-model:open="open" :src="srcList" :default-current="0" />
</template>
通过 preview 对象的 open 与 current 控制。
<script setup>
import { ref } from "vue";
import { Image, PreviewGroup } from "@reglow/reui";
const open = ref(false);
const current = ref(0);
</script>
<template>
<button @click="open = true">打开预览</button>
<PreviewGroup
:preview="{
open,
current,
onOpenChange: (val) => (open = val),
onChange: (val) => (current = val),
}"
:items="['/image1.jpg', '/image2.jpg']"
>
<Image src="/image1.jpg" :width="200" :height="200" />
</PreviewGroup>
</template>
| 参数 | 说明 | 类型 | 默认值 |
|---|
| src | 图片地址 | string | - |
| alt | 图像描述 | string | - |
| width | 图像宽度 | string | number | - |
| height | 图像高度 | string | number | - |
| fallback | 加载失败容错地址 | string | - |
| placeholder | 加载占位 | VNode | boolean | - |
| preview | 预览参数,为 false 时禁用 | boolean | PreviewType | true |
| previewMask | 是否显示预览遮罩 | boolean | true |
| crossOrigin | crossorigin | anonymous | use-credentials | - |
| class | 附加类名 | string | - |
| 事件 | 说明 | 回调参数 |
|---|
| error | 加载错误回调 | (event: Event) |
| 参数 | 说明 | 类型 | 默认值 |
|---|
| items | 预览数组 | string[] | ImagePreviewItem[] | [] |
| preview | 预览参数,为 false 时禁用 | boolean | PreviewGroupType | true |
| fallback | 加载失败容错地址 | string | - |
| 事件 | 说明 | 回调参数 |
|---|
| update:open | 显示状态变化 | (open: boolean) |
| update:current | 当前图片变化 | (current: number) |
| openChange | 预览打开状态变化 | (open: boolean, info: { current: number }) |
| change | 切换预览图 | (current: number, prevCurrent: number) |
| 参数 | 说明 | 类型 | 默认值 |
|---|
| src | 自定义预览 src | string | - |
| open | 是否显示预览 | boolean | - |
| onOpenChange | 预览打开状态变化回调 | (open: boolean) => void | - |
| scaleStep | 缩放步长 | number | 0.5 |
| minScale | 最小缩放倍数 | number | 1 |
| maxScale | 最大缩放倍数 | number | 50 |
| movable | 是否可移动 | boolean | true |
| mask | 遮罩效果 | boolean | { enabled?: boolean; blur?: boolean; closable?: boolean } | true |
| getContainer | 指定预览挂载节点 | string | HTMLElement | (() => HTMLElement) | false | - |
| closeIcon | 自定义关闭 Icon | VNode | - |
| actionsRender | 自定义工具栏 | (originalNode, info) => VNode | - |
| imageRender | 自定义预览内容 | (originalNode, info) => VNode | - |
继承 PreviewType,额外支持:
| 参数 | 说明 | 类型 | 默认值 |
|---|
| current | 当前预览图 index | number | - |
| onChange | 切换预览图回调 | (current: number, prevCurrent: number) => void | - |
| countRender | 自定义计数内容 | (current: number, total: number) => VNode | - |
| 按键 | 功能 |
|---|
ESC | 关闭预览 |
← | 上一张 |
→ | 下一张 |
+ / = | 放大 |
- | 缩小 |
R | 右旋转 |
| 滚轮 | 缩放 |
| 双击 | 重置变换 |
| 拖拽 | 移动图片 |