antd 实现通过点击按钮的方式预览一组图片

需求背景

最近公司的PM提了一个优化需求,要求点击一个按钮能弹出预览多张图片的交互效果,演示动画长这样。

于是我打开 antd 官网想搜寻相关的例子,仅发现了通过按钮预览单张图片的示例

html 复制代码
<template>
  <div>
    <a-button type="primary" @click="() => setVisible(true)">show image preview</a-button>
    <a-image
      :width="200"
      :style="{ display: 'none' }"
      :preview="{
        visible,
        onVisibleChange: setVisible,
      }"
      src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
    />
  </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue';
const visible = ref<boolean>(false);
const setVisible = (value): void => {
  visible.value = value;
};
</script>

那如何实现在不展示 <a-image /> 组件的情况下预览多张图呢?

实现方案

首先,我们知道 antd 的预览多张图是通过 <a-image-preview-group /> 组件实现,通过在 <a-image-preview-group /> 内放置 <a-image /> 组件,当触发 <a-image /> 组件的 onClick 事件能做到 单击左右切换按钮预览多张图像。

那么我们只需要手动触发 <a-image-preview-group /> 内的 <a-image /> 组件的 onClick 事件即可实现多张图片的预览效果。

因为需求是通过点击按钮展示预览效果,那么我们得先在渲染时隐藏所有的 <a-image /> 组件:

html 复制代码
<a-image-preview-group>
    <a-image
        v-for="(url, i) in files"
        :key="i"
        :width="0"
        :src="url"
        ref="imageRefs"
        style="display: none"
    />
</a-image-preview-group>

为了能够访问到 <a-image /> 组件实例,需要绑定给组件绑定 ref 来获取实例。

假设页面上现在有一个预览的 button,接下来我们绑定给它绑定一个 onPreviewImagesclick 事件。

js 复制代码
const imageRefs = ref([]);

// 当触发 onPreviewImages 函数执行时,取得第一个 `<a-image />` 组件实例并手动调用 click 事件
// 实现预览效果
const onPreviewImages = () => {
   const aImage = first(imageRefs.value);
   aImage && aImage.$el.nextSibling.click();
}

结尾

至此,我们已经实现了仅通过手动调用事件的方法来实现预览一组图片的效果。🌟

最后我不解的是,既然 antd 提供了对单张图片的手动预览支持,那实现多张图片的手动控制预览也不难,也许这种业务场景比较少见吧。

相关推荐
jeffwang5 分钟前
我做了个让 AI 看屏幕跑测试的工具,因为 Playwright 测不了我的 Flutter Web
前端
HSunR34 分钟前
dify 搭建ai作业批改流
开发语言·前端·javascript
代码不加糖42 分钟前
2026 跨境电商独立站实战:从 0 到 1 搭建高转化 SaaS 商城(附源码)
开发语言·前端·javascript
亲亲小宝宝鸭1 小时前
拖一拖控件,拖出个问卷(低代码平台)
前端·低代码
江南十四行1 小时前
ReAct Agent 基本理论与项目实战(一)
前端·react.js·前端框架
We་ct2 小时前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·leetcode·typescript·动态规划
小呆呆6662 小时前
Codex 穷鬼大救星
前端·人工智能·后端
当时只道寻常3 小时前
Vue3 + IntersectionObserver 实现高性能图片懒加载
前端
sakiko_3 小时前
UIKit学习笔记3-布局、滚动视图、隐藏或显示视图
前端·笔记·学习·objective-c·swift·uikit
有一个好名字4 小时前
Agent Loop —— 一切从那个 while 循环开始
前端·javascript·chrome