如何在Next.js中使用react-viewer图片预览

1.安装依赖
使用npm,或者pnpm进行包安装依赖包

npm i react-viewer
# or pnpm add react-viewer

2.封装依赖包组件
将依赖包引入到文件之中,然后封装成组件,以备后面业务逻辑中使用;其示例代码如下:

import { FC, memo, useMemo } from 'react';
import Viewer from 'react-viewer';
import { nonEmptyArr } from '@lib/utils';

interface imagesProps {
  src: string;
  alt: string;
}
interface ReactViewerProps {
  imgUrls: any[]; // 预览的数据
  visible: boolean; // 是否打开弹窗
  handleClose: () => void; // 弹窗回调
  getImageUrl: (str: string) => string; // 获取cnd地址函数
  key?: string; // 获取需要预览数据的key
  activeIndex?: number; // 打开弹窗当前预览图片的位置
  needCDN?: boolean; // 是否需要使用CDN地址 
}

const ReactViewer: FC<ReactViewerProps> = ({
  imgUrls,
  visible,
  handleClose,
  getImageUrl,
  key,
  activeIndex = 0,
  needCDN = true,
}) => {
  const images: imagesProps[] = useMemo(() => {
    const imgArr: any = [];
    if (nonEmptyArr(imgUrls)) {
      imgUrls.forEach((item: any) => {
        if (key) {
          imgArr.push({
            src: needCDN ? getImageUrl(item?.[key]) : item?.[key],
            alt: '',
          });
        } else {
          imgArr.push({
            src: needCDN ? getImageUrl(item) : item,
            alt: '',
          });
        }
      });
    }
    return imgArr;
  }, [imgUrls]);

  return (
    <>
      {nonEmptyArr(images) && visible && (
        <Viewer visible={visible} onClose={handleClose} images={images} activeIndex={activeIndex} />
      )}
    </>
  );
};

export default memo(ReactViewer);

3.使用示例
如何正确的使用一封装好的组件组件,其使用场景如下所示:

import dynamic from 'next/dynamic';
import { useState } from 'react';
const ReactViewer = dynamic(() => import('../ReactViewer'), { ssr: false });
const TestDemo = () = > {
  const imgUrls = ['abc.png','bcd.jpg'];
	const [showBigImage, setShowBigImage] = useState<boolean>(false);
	const getImageUrl = () => {
    // todo... 获取cdn的函数
  }
	const handleBigImg = () => {
    setShowBigImage((showBigImage) => !showBigImage)
  }
  return (
    <ReactViewer
      visible={showBigImage}
      handleClose={handleBigImg}
      imgUrls={imgUrls}
      getImageUrl={getImageUrl}
    />
  )
}
export default TestDemo;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值