react - 自己实现一个图片预览器

0 => 1 实现一个仿百度的图片预览,操作的组件

实现功能:

  1. 缩放✔
  2. 旋转✔
  3. 拖动✔
  4. 切换的动画
  5. 分享
  6. 可导出多种格式(支持下载)✔
  7. 二维码扫描到手机观看✔
  8. 水印
  9. 待定

ok,先做下准备工作
我们定义一个状态类,这是我们图片的所有属性,后续就是通过js操作这些属性来改变img
在这里插入图片描述
外部只需传进来一个图片url,我们即可实现上面的功能。暂时先写这么多,有想加的功能可以加

定义一个方法类,用来写我们的功能方法,这里写了个缩放试了下代码
在这里插入图片描述

定义一个渲染dom的类,因为我们的图片节点都是js创建的
在这里插入图片描述
这俩方法测试用

最后,写一个Image类暴露给外部在这里插入图片描述
到这已经能跑通了,实现滚轮缩放在这里插入图片描述
百度上的功能先补上
在这里插入图片描述

  1. 图片列表(轮播)
  2. 放大缩小
  3. 合适尺寸
  4. 全屏
  5. 二维码扫描到手机
  6. 下载
    大概就是这些功能,我们把底下的图标给他们补上
    在这里插入图片描述

每一个就是一个icon,我们把他们渲染到页面中
在这里插入图片描述
我们通过ref来保存持久化变量,也就是这个图片的实例,我们从外部传进来一个唯一的url,然后生成一个img dom,所以我们的hooks是随着这个唯一url来进行刷新的,所以我们使用useCallback返回对图片render后的实例,避免在url未变的情况下,重复渲染 img
ahooksusePersistFn可以在操作img dom的同时拒绝不必要的re render
在这里插入图片描述
但其实页面在这边是有问题的 —— 重复渲染了icon组件。
我的设想是icon组件只要渲染一次,改变只是ref指向的img实例,暂时这边还没对这块做处理
在这里插入图片描述
在这里插入图片描述
会被重复渲染的问题以后再解决。
接下来就是把这些功能都补全

import States from "./state";
import {
    canvasToDataURL } from 'util';
import QRCode from 'qrcode';

class Method extends States {
   

    // 缩放
    zoomToWheel() {
   
        if (!this.container) return;
        // onWheel => 滚轮、触控板事件
        this.container.addEventListener("wheel", (e) => {
   
            const _zoom = e.deltaY > 0; // true => 放大 false => 缩小
            const width = parseFloat(this.imgDom.style.width);
            const height = parseFloat(this.imgDom.style.height);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React-viewer是一个基于React封装的插件,用于实现大图预览功能。它可以通过引入该插件并使用其提供的组件,实现图片预览、放大和缩小等功能。该插件的GitHub地址是\[2\],npm地址是\[2\],在线演示可以在\[2\]中找到。通过使用React-viewer,你可以方便地在React应用中实现图片的大图预览功能。 #### 引用[.reference_title] - *1* [React项目实现图片预览-viewerjs-react 点击图片放大查看组件,可翻转插件](https://blog.csdn.net/z611739/article/details/120732958)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [React之使用React-viewer实现大图预览](https://blog.csdn.net/Welkin_qing/article/details/116061275)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [react-native-image-viewer实现大图预览](https://blog.csdn.net/xiangzhihong8/article/details/80806258)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值