antd5 上传图片支持裁剪处理和预览图片(antd-img-crop)

文档:https://github.com/nanxiaobei/antd-img-crop/blob/main/README.zh-CN.md

安装

pnpm add antd-img-crop
# or
yarn add antd-img-crop
# or
npm i antd-img-crop

使用

import { Upload } from 'antd';
import ImgCrop from 'antd-img-crop';

const Demo = () => (
  <ImgCrop>
    <Upload>+ Add image</Upload>
  </ImgCrop>
);

Props

属性类型默认说明
qualitynumber0.4裁切图片质量,01 之间
fillColorstring'white'裁切图像填充色
zoomSliderbooleantrue图片缩放控制
rotationSliderbooleanfalse图片旋转控制
aspectSliderbooleanfalse裁切比率控制
showResetbooleanfalse显示重置按钮,重置缩放旋转及比率
resetTextstring重置重置按钮文字
aspectnumber1 / 1裁切区域宽高比,width / height
minZoomnumber1最小缩放倍数
maxZoomnumber3最大缩放倍数
cropShapestring'rect'裁切区域形状,'rect''round'
showGridbooleanfalse显示裁切区域网格(九宫格)
cropperPropsobject-[react-easy-crop] 的 props(* 已有 props 无法重写)
modalClassNamestring''弹窗 className
modalTitlestring'编辑图片'弹窗标题
modalWidthnumber | string弹窗宽度
modalOkstring确定按钮文字
modalCancelstring取消按钮文字
onModalOKfunction-点击确定按钮的回调
onModalCancelfunction-点击取消按钮、遮罩层、或右上角 ‘x’ 的回调
modalPropsobject[Ant Design Modal] 的 props(* 已有 props 无法重写)
beforeCropfunction-裁切弹窗打开前的回调,若返回 falsereject,弹窗将不会打开

支持预览图片

利用Upload组件的openFileDialogOnClick属性


const ImageUpload: React.FC<ImageUploadProps> = (props) => {
  const { 
    imageUrl, 
    aspect,
    loading, 
    onRemove, 
    uploadAction,  
  } = props;

  const [visible, setVisible] = useState(false);

  return (
    <ImgCrop
      aspect={aspect}
      quality={1}
      rotationSlider
    >
      <Upload
     
        name="avatar"
        listType="picture-card"
        maxCount={1}
        showUploadList={false}
        customRequest={({ file }) => {
          uploadAction(file);
        }}
        openFileDialogOnClick={!imageUrl}//当图片资源链接不存在时打开文件上传对话框
      >
        {imageUrl ? (
          <>
            <Image
              src={imageUrl}
              preview={{
                visible: visible,
                mask: (
                  <div>
                    <Button
                      type="text"
                      style={{ backgroundColor: 'transparent' }}
                      icon={<EyeOutlined  />}
                      onClick={() => {
                        setVisible(true);
                      }}
                    >
                    </Button>
                    <Button
                      type="text"
                      style={{ backgroundColor: 'transparent' }}
                      icon={<DeleteOutlined  />}
                      onClick={() => {
                        onRemove && onRemove();
                      }}
                    >
                    </Button>
                  </div>
                ),
                onVisibleChange: (visible) => {
                  if (!visible) {
                    setVisible(visible);
                  }
                }
              }}
              height={'100%'}
              width={'100%'}
              fallback={CALLBACK_IMG}//CALLBACK_IMG加载失败图片
            />
          </>
        ) : (
          <div>
            {loading ? (  <LoadingOutlined />) : (
              <>
                <PlusOutlined />
                <div >Upload</div>
              </>
            )}
          </div>
        )}
      </Upload>
    </ImgCrop>
  );
};

export default ImageUpload;
import {uploadFile} from '@/service/upload'
const Form = () => {
const [loading, setLoading] = useState(false)
const [imageUrl, setImageUrl ] = useState('')

const uploadAction = (file) => {
setLoading(true)
    // 上传文件
  uploadFile(file).then((res: string) => {
    setImageUrl(res)
    setLoading(false)
  }).catch(() => {
    setLoading(false)
  })
}

  return (
    <ImageUpload
      aspect={1}
      loading={loading}
      imageUrl={imageUrl}
      uploadAction={uploadAction}
      onRemove={() => {
        setImageUrl('');
      }}
    />
  )
}

export default Form;

在这里插入图片描述

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值