React实现多图片预览功能、预览图上下张切换(实战示例)
前言
在React项目中,展示和预览多张图片是一种常见的需求。本篇帖子将介绍如何使用React和antd
库来实现这一功能,并探讨如何在预览模态框中切换到前一张或后一张图片。
背景
我们将以一个OCR图像列表展示的示例来演示代码的运用。假设我们有一个OCR系统,可以将图片文件中的文本提取出来。我们希望在前端展示从OCR系统返回的图像列表,并支持点击图片来进行预览。此外,我们还希望在预览模态框中能够实现切换到前一张或后一张图片的功能。下面是具体的操作示例:
操作示例:
-
首先,我们需要导入所需的组件和
hooks
:import React, { useEffect, useState } from 'react'; import { Row, Col, Modal} from 'antd';
-
接下来,我们定义一个
Splitor
组件,该组件将用于展示多张图片和实现预览功能:const Splitor: React.FC = () => {const [ocrImageList, setOcrImageList] = useState<ETEST.ImageInfo[]>([]); // 图片列表的状态const [visible, setVisible] = useState(false); // 大图预览的可见性状态const [currentImage, setCurrentImage] = useState(""); // 当前点击的图片路径useEffect(() => {const intervalId = setInterval(updateOcrImageList, 1000 * 10); // 创建定时器,每 10 秒钟调用一次 updateOcrImageList 函数// 组件卸载时清除定时器return () => {clearInterval(intervalId);};}, []);const updateOcrImageList = async () => {try {const msg = await ocrList(); // 调用 ocrList 函数获取最新的图片列表console.log('ocrList响应数据=', msg.data);if (msg.isSuccess && msg.data.length > 0) {setOcrImageList(msg.data); // 更新图片列表状态}} catch (error) {console.error(error);}};const handleImageClick = (imagePath: string) => {setCurrentImage(imagePath); // 设置当前点击的图片路径setVisible(true); // 显示大图预览};return (<Row gutter={24}>{/* 遍历渲染图片列表 */}{ocrImageList.map((image) => ({/* 图片容器 */}<Col span={4} key={image.id}>{/* 图片元素 */}<div style={{ border: '1px solid #ccc', borderRadius: '8px', padding: '16px', marginBottom: '20px' }}><imgsrc={image.imgPath}alt={image.id}style={{ width: '100%', objectFit: 'contain', cursor: 'pointer' }}onClick={() => handleImageClick(image.imgPath)} // 点击图片时调用 handleImageClick 函数/></div>{/* 图片描述 */}<div style={{ textAlign: 'center' }}>{image.content}</div> // 显示图片内容</Col>))}{/* 大图预览弹窗 */}<Modal visible={visible} onCancel={() => setVisible(false)} footer={null} className="custom-modal"><img src={currentImage} alt="Preview" style={{ height: "100%", width: "100%" }} /></Modal></Row>); };
在上述代码中,我们使用
useState
来维护了多个状态变量,包括ocrImageList
(图片列表数据)、visible
(控制模态框的显示与隐藏)、currentImage
(当前要预览的图片路径)。我们通过
updateOcrImageList
函数来异步获取ocrImageList
数据,并在handleImageClick
函数中实现了点击图片触发预览的功能。在返回的
JSX
中,我们通过遍历ocrImageList
并使用antd
的Col
和Row
组件来展示图片。图片被点击后,会调用handleImageClick
函数来设置currentImage
和visible
状态,从而展示预览模态框。
拓展(预览图片切换):
- 导入新增
import Lightbox from 'react-image-lightbox';import 'react-image-lightbox/style.css';
- 在预览模态框中切换到前一张或后一张图片。以下是相应的代码更改调整:
// ...// 点击图片触发预览功能
const handleImageClick = (index: number) => {setPreviewIndex(index);
};// 关闭预览
const handleClosePreview = () => {setPreviewIndex(-1);
};// 创建预览图片路径数组
const previewImages = ocrImageList.map((image) => image.imgPath);return (<Row gutter={24}>{/* 遍历渲染图片列表 */}{ocrImageList.map((image, index) => (<Col span={4} key={image.id}>{/* 图片容器 */}<div style={{ border: '1px solid #ccc', borderRadius: '8px', padding: '16px', marginBottom: '20px' }}>{/* 图片元素 */}<imgsrc={image.imgPath}alt={image.id}style={{ width: '100%', objectFit: 'contain', cursor: 'pointer' }}onClick={() => handleImageClick(index)} // 点击图片时调用 handleImageClick 函数/></div>{/* 图片描述 */}<div style={{ textAlign: 'center' }}>{image.content}</div></Col>))}{/* 如果正在预览图片,渲染预览模态框 */}{previewIndex !== -1 && (<Lightbox// 配置预览相关属性mainSrc={previewImages[previewIndex]}nextSrc={previewImages[(previewIndex + 1) % previewImages.length]}prevSrc={previewImages[(previewIndex + previewImages.length - 1) % previewImages.length]}onCloseRequest={handleClosePreview}onMovePrevRequest={() => setPreviewIndex((previewIndex + previewImages.length - 1) % previewImages.length)}onMoveNextRequest={() => setPreviewIndex((previewIndex + 1) % previewImages.length)}/>)}</Row>
);// ...
在上面的代码中,我们使用了react-image-lightbox
库来实现图片预览功能。当用户点击图片时,将打开预览模态框,并可以在预览模态框中切换到前一张或后一张图片。关闭预览模态框时,预览索引将被重置为-1
。
注意
,上述代码仅为示例。你可以根据自己的需求进行进一步的样式和逻辑调整。
总结
本篇帖子介绍了如何使用React和antd库实现多图片预览功能,并在预览模态框中实现了切换到前一张或后一张图片的拓展功能。通过对状态的管理和处理用户点击事件,我们可以轻松地实现这一功能。希望本篇文章能帮助你理解和应用多图片预览的技术实现方法。
相关文章:
React实现多图片预览功能、预览图上下张切换(实战示例)
前言 在React项目中,展示和预览多张图片是一种常见的需求。本篇帖子将介绍如何使用React和antd库来实现这一功能,并探讨如何在预览模态框中切换到前一张或后一张图片。 背景 我们将以一个OCR图像列表展示的示例来演示代码的运用。假设我们有一个OCR系…...
【NLP的Python库(04/4)】:Flair
一、说明 Flair是一个现代的NLP库。从文本处理到文档语义,支持所有核心 NLP 任务。Flair使用现代转换器神经网络模型来完成多项任务,并结合了其他Python库,可以选择特定的模型。其清晰的API和注释文本的数据结构,以及多语言支持&a…...
Vue框架学习大纲
Vue.js 是一个构建用户界面的框架,尤其是单页面应用。以下是一些主要基于 Vue 2.x 的版本必须了解的 Vue.js基本知识点和特性: Vue 实例: 创建一个 Vue 实例是开始使用 Vue 的第一步。 var vm new Vue({// 选项 });数据绑定: Vue 提供了非常直观的数据绑…...
利用PPT导出一张高清图的方法,office与WPS只需要使用一个即可,我使用的是office。
利用PPT导出一张高清图的方法,office与WPS只需要使用一个即可,我使用的是office。 1,PPT的功能拓展来解决导出高清图片方法1.1,PPT功能拓展—>安装插件: 2,各种方法导出图片效果显示:2.1&…...
2023年【四川省安全员B证】最新解析及四川省安全员B证模拟考试
题库来源:安全生产模拟考试一点通公众号小程序 四川省安全员B证最新解析考前必练!安全生产模拟考试一点通每个月更新四川省安全员B证模拟考试题目及答案!多做几遍,其实通过四川省安全员B证模拟考试题很简单。 1、【多选题】5.5kW…...
某瑞集团安全技术研发岗位面试
本文由掌控安全学院 - sbhglqy 投稿 一、自我介绍 阿吧阿吧,不多说 二、就ctf比赛经历方面提些问题 面试官:ctf打了多久了 我:两三年了。 面试官:得过什么奖项没有 我:本科的时候得过一个校一等奖。 面试官&#x…...
学习笔记|ADC反推电源电压|扫描按键(长按循环触发)|课设级实战练习|STC32G单片机视频开发教程(冲哥)|第十八集:ADC实战
文章目录 1.ADC反推电源电压测出Vref引脚电压的意义?手册示例代码分析复写手册代码Tips:乘除法与移位关系为什么4096后面还有L 2.ADC扫描按键(长按循环触发)长按触发的实现 3.实战小练1.初始状态显示 00 - 00 - 00,分别作为时,分,…...
2020 款凯迪拉克 XT5 车发动机加速异响
故障现象 一辆2020款凯迪拉克XT5车,搭载LSY发动机,累计行驶里程约为8万km。车主反映,加速时发动机有明显异响。 故障诊断 接车后试车,起动发动机,发动机怠速运转平稳;打开发动机室盖,能够听到轻…...
【AI视野·今日CV 计算机视觉论文速览 第255期】Wed, 27 Sep 2023
AI视野今日CS.CV 计算机视觉论文速览 Wed, 27 Sep 2023 (showing first 100 of 103 entries) Totally 100 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Generating Visual Scenes from Touch Authors Fengyu Yang, Jiacheng Zhang, Andre…...
Java应用生产Full GC或者OOM问题如何定位
1 引言 生产应用服务频繁Full GC却无法释放内存,甚至可能OOM,这种情况很有可能是内存泄露或者堆内存分配不足,此时需要dump堆信息来定位问题,查看是哪些地方内存泄漏。 Dump文件也称为内存转储文件或内存快照文件,是…...
Data processing flow
1. 找出第一年的address,有lat和long,自动生成 csv_log_lat_county.ipynb import csv from geopy.geocoders import Nominatim from geopy.exc import GeocoderTimedOutgeolocator Nominatim(user_agent"my-app") data_csv r"D:/year…...
CAP理论与BASE理论
分布式领域CAP理论: Consistency(一致性), 数据一致更新,所有数据变动都是同步的Availability(可用性), 好的响应性能Partition tolerance(分区容错性) 可靠性定理:任何分布式系统只可同时满足二点,没法三者兼顾。忠告࿱…...
DRM全解析 —— ADD_FB2(3)
接前一篇文章:DRM全解析 —— ADD_FB2(2) 本文参考以下博文: DRM驱动(四)之ADD_FB 特此致谢! 上一回围绕libdrm与DRM在Linux内核中的接口: DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB2,…...
【Java】SpringMVC ResponseBodyAdvice详解
目录 1. ResponseBodyAdvice 2. supports方法 3. beforeBodyWrite方法 4. 实践 1. ResponseBodyAdvice Spring MVC的ResponseBodyAdvice是Spring 4.1版本中引入的一个接口,它允许在Controller控制器中ResponseBody修饰的方法或ResponseEntity执行之后ÿ…...
python常见面试题五
解释 Python 中的列表推导式 (list comprehension)。 答:列表推导式是一种创建新列表的简洁方式。它可以在一行代码中通过对一个可迭代对象应用表达式和条件来生成新的列表。 解释 Python 中的时间复杂度和空间复杂度。 答:时间复杂度衡量算法运行时间的…...
SpringBoot结合Vue.js+axios框架实现增删改查功能+网页端实时显示数据库数据(包括删除多条数据)
本文适用对象:已有基础的同学,知道基础的SpringBoot配置和Vue操作。 在此基础上本文实现基于SpringBoot和Vue.js基础上的增删改查和数据回显、刷新等。 一、实时显示数据库数据 实现步骤: 第1步:编写动态请求响应类:…...
曙光亮相工博会,发布首款国产高端工业实时仿真计算系统
9月19日-23日,中科曙光亮相第23届中国国际工业博览会,并受邀于主论坛发表主题演讲,在工业权威会议上展示曙光领先的工业数字化技术与实践成果。展会期间,曙光重磅发布首款国产工业实时仿真计算系统,并展出多项工业数字…...
「大数据-2.0」安装Hadoop和部署HDFS集群
目录 一、下载Hadoop安装包 二、安装Hadoop 0. 安装Hadoop前的必要准备 1. 以root用户登录主节点虚拟机 2. 上传Hadoop安装包到主节点 3. 解压缩安装包到/export/server/目录中 4. 构建软链接 三、部署HDFS集群 0. 集群部署规划 1. 进入hadoop安装包内 2 进入etc目录下的hadoop…...
文档在线预览word、pdf、excel文件转html以实现文档在线预览
目录 一、前言 1、aspose2 、poi pdfbox3 spire二、将文件转换成html字符串 1、将word文件转成html字符串 1.1 使用aspose1.2 使用poi1.3 使用spire2、将pdf文件转成html字符串 2.1 使用aspose2.2 使用 poi pbfbox2.3 使用spire3、将excel文件转成html字符串 3.1 使用aspose…...
FFmpeg视音频分离器----向雷神学习
雷神博客地址:https://blog.csdn.net/leixiaohua1020/article/details/39767055 本程序可以将封装格式中的视频码流数据和音频码流数据分离出来。 在该例子中, 将FLV的文件分离得到H.264视频码流文件和MP3 音频码流文件。 注意: 这个是简化版…...
CentOS 8开启bbr
CentOS 8 默认内核版本为 4.18.x,内核版本高于4.9 就可以直接开启 BBR,所以CentOS 8 启用BBR非常简单不需要再去升级内核。 开启bbr echo "net.core.default_qdiscfq" >> /etc/sysctl.conf echo "net.ipv4.tcp_congestion_contro…...
Redis的安装与基本使用
文章目录 Linux 环境下安装Redis下载Redis 安装包解压安装包安装Redis进入redis安装包下编译并且安装到指定目录下 启动redis配置远程访问找到Redis.config文件 Windows 环境下安装Redis说明官方提供方式安装或启用WSL2在WSL(Ubuntu)上安装Redis启动Redi…...
2014 款金旅牌小型客车 发动机怠速抖动、加速无力
故障现象 一辆2014款金旅牌小型客车,搭载JM491Q-ME发动机,累计行驶里程约为20万km。车主反映,最近该车发动机怠速抖动、加速无力,且经常缺少冷却液。 故障诊断 根据车主描述的故障现象,初步判断该车气缸垫损坏&#…...
R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化...
全文链接:https://tecdat.cn/?p33760 众所周知,心脏疾病是目前全球最主要的死因。开发一个能够预测患者心脏疾病存在的计算系统将显著降低死亡率并大幅降低医疗保健成本。机器学习在全球许多领域中被广泛应用,尤其在医疗行业中越来越受欢迎。机器学习可…...
网站被劫持了怎么办
网站被劫持了怎么办 建议新建一个index.html文件,文件中只写几个数字,上传到网站根目录,然后访问网站域名,看看是不是正常,从而可以确定是程序问题还是域名被劫持的问题。 如果是域名被劫持,你可以登录你的…...
【面试题精讲】Java包装类缓存机制
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是 Java 包装类缓存机制? Java 中的包装类(Wrapper Class)是为了将…...
网络相关知识
0 socket SOCK_DGRAM #无连接UDP SOCK_STREAM #面向连接TCP 1 UDP 1.1 检测UDP yum install -y nc 使用netcat测试连通性 服务器端启动 UDP 30003 端口 nc -l -u 30003 客户端连接服务器的30003端口(假设服务的IP地址是119.23.67.12) nc -u 119…...
商品冷启动推荐综述
About Me: LuckBoyPhd/Resume (github.com) (1)一种基于三部图网络的协同过滤算法 推荐系统是电子商务领域最重要的技术之一,而协同过滤算法又是推荐系统用得最广泛的.提出了一种基于加权三部图网络的协同过滤算法,用户、产品及标签都被考虑到算法中,并且研究了标签结点的度对…...
GEO生信数据挖掘(二)下载基因芯片平台文件及注释
检索到目标数据集后,开始数据挖掘,本文以阿尔兹海默症数据集GSE1297为例 目录 下载平台文件 1.AnnotGPL参数改为TRUE,联网下载芯片平台的soft文件。(国内网速奇慢经常中断) 2.手工去GEO官网下载 转换芯片探针ID为gene name 拓…...
淘宝电商必备的大数据应用
在日常生活中,大家总能听到“大数据”“人工智能”的说法。现在的大数据技术应用,从大到巨大科学研究、社会信息审查、搜索引擎,小到社交联结、餐厅推荐等等,已经渗透到我们生活中的方方面面。到底大数据在电商行业可以怎么用&…...
杭州网站设计公司价格/推广普通话手抄报内容大全资料
1、当事人既约定违约金,又约定定金的,一方违约时,这两种违约责任( )。(1 分) A.可合并使用 B.适用数值较小者 C.适用数值较大者 D.只能选择其一…...
网站图片上传不了怎么办/关键词歌曲免费听
本章概要 Java 中的锁 乐观锁悲观锁自旋锁synchronizedReentrantLocksynchronized 与 ReentrantLock 对比SemaphoreAtomicInteger可重入锁公平锁和非公平锁读写锁共享锁和独占锁重量级锁和轻量级锁偏向锁分段锁同步锁和死锁如何进行锁优化 2.6 Java 中的锁 Java 中的锁主要…...
wordpress模板设置/汕头seo网络推广服务
一、mysql centos6.7 二进制安装5.6 查看系统版本 cat /etc/redhat-release 2.下载 mysql 5.6包 3.添加用户和组 groupadd mysql useradd -g mysql mysql 4.安装mysql到/usr/local/mysql 下cd /usr/local tar zxvf mysql……………………5.修改就压后文件名为mysql mv mysql……...
找个人给我做电影网站/宁波seo教程行业推广
2019独角兽企业重金招聘Python工程师标准>>> 改写了leader的程序,现在支持读取EXCEL表格(以路径字符串的形式作为参数传入),当然是那种一个sheet一张表的,而且格式比较固定,只能是这样的形式&am…...
wordpress缓冲/百度推广的优化软件
SELinux是「Security-Enhanced Linux」的简称,是美国国家安全局「NSAThe National Security Agency」 和SCC(Secure Computing Corporation)开发的 Linux的一个扩张强制访问控制安全模块。原先是在Fluke上开发的,2000年以 GNU GPL…...
广州房地产网站建设/百度云
每年过年过节 被问工作,问薪酬,忙着应付各种问题,家里小孩也多,一年攒的钱包的红包就去掉了大半,这不赶紧趁着金九银十即将到来的这股热劲,开启了我的面试之路... 没办法啊,还是要进大厂搬砖&a…...