博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义input上传图片组件
阅读量:6448 次
发布时间:2019-06-23

本文共 3048 字,大约阅读时间需要 10 分钟。

自定义input上传图片组件,美化样式

前段时间因为项目需求,做过一个上传图片组件,这里分享下大致思路,希望对有需要的童鞋有所帮助~~~


功能需求:1.上传图片限制大小、分辨率、类型         2.上传图片支持自由裁剪         3.图片上传后支持预览和删除

效果图,只截取了一小部分,大致看下就ok啦,是不是感觉比原生的好看多了^_^

图片描述

项目是基于react框架写的,话不多说,开始撸代码~~~

Step1:编写基础html结构

// uploadButton组件代码如下: const uploadButton = (
上传照片
);

Step2:基础样式

input-file {  width: 0.1px;  height: 0.1px;  opacity: 0;  overflow: hidden;  position: absolute;  z-index: -1;}.ant-upload {  @w: 100px;  width: @w;  height: @w;  padding: 5px;  background-color: #fafafa;  border: 1px dashed #d9d9d9;  border-radius: 4px;  display: block;  cursor: pointer;  position: relative;}.upload-plus-text {  width: 100%;  text-align: center;  position: absolute;  left: 0;  top: 50%;  transform: translateY(-50%);  i {    font-size: 28px;    color: #999;  }  .ant-upload-text {    margin-top: 8px;    font-size: 12px;    color: #666;  }}

Step3:添加事件处理

对上传图片的类型、大小和分辨率进行检测

 {    this.onFileChange(e);  }}/>// 一些常量定义const IMAGE_MIN_WIDTH = 1280; // 上传图片最小宽const IMAGE_MIN_HEIGHT = 800; // 上传图片最小高const IMAGE_MAX_SIZE = 1024 * 1024; // 上传图片最大大小// 处理上传文件  onFileChange(e) {    const file = e.target.files[0];    e.target.value = ''; // 再次上传同一文件进行裁剪    if (this.handleBeforeUpload(file)) {      const reader = new FileReader();      reader.onload = e => {        const src = e.target.result;        const image = new Image();        const _this = this;        image.onload = () => {          const width = image.width;          const height = image.height;          if (width >= IMAGE_MIN_WIDTH && height >= IMAGE_MIN_HEIGHT) {            _this.setState({              initialImageUrl: src,              showCropModal: true            });          } else {            message.error('照片分辨率小于1280*800');          }        };        image.src = src;      };      reader.readAsDataURL(file);    }  }// 检查照片格式、大小等信息  handleBeforeUpload(file) {    if (file) {      const sizeOk = file.size < IMAGE_MAX_SIZE;      const typeReg = new RegExp(/^image\/bmp|gif|jpg|jpeg|png$/, 'i');      const typeOk = typeReg.test(file.type);      if (!typeOk) {        message.error('照片格式有误');      } else if (!sizeOk) {        message.error('照片大小超过1M');      }      return sizeOk && typeOk;    }  }

Step4:裁剪功能

代码较多就不展示了= =,使用的是

Step5:预览和删除功能

预览功能实现思路就是通过判断是否已经上传图片来展示不同的状态。未上传展示uploadButton组件,已上传就展示imagePreview组件。

通过判断是否已经上传图片来控制input标签的id属性值,未上传图id='file',已上传图片将id='',这样一来,再次去点击label的时候由于for属性找不到对应的id,就不会触发input上onChange事件

{ this.onFileChange(e); }} />
// imagePreview组件代码如下const imagePreview = (
); // 预览图片handlePreview() { this.setState({ showPreviewModal: true });}// 删除图片swapImageFile() { this.setState({ imageUrl: '' });}

写在最后:项目涉及代码较多,文章只展示了大部分代码,一些具体细节代码可能就没有展示了,还望见谅,第一次写文章,可能比较混乱,有问题还望大家指出~~~ ^_^

转载地址:http://melwo.baihongyu.com/

你可能感兴趣的文章
个性导航栏制作
查看>>
HTML标签(一)
查看>>
php写shell脚本
查看>>
nfs服务器在centos6.7 64Bit下的搭建
查看>>
实力为王 八年DBA经验谈
查看>>
Redis SDS
查看>>
date -d "-1 days "
查看>>
表关系配置
查看>>
AWK 工具介绍
查看>>
我的友情链接
查看>>
锐捷7716、7708抓流表(抓包)
查看>>
java 内部类详解
查看>>
websocket实战(2) 信息处理发送、接收和编码
查看>>
node.js开发环境搭配&请求响应实现原理
查看>>
linux文本处理命令
查看>>
iptables在企业网中的应用
查看>>
日志组件logback的介绍及配置使用方法
查看>>
关于一些由于apache配置不而导致的错误和其它
查看>>
js分解字符串
查看>>
NSUserDefaults轻量级本地存储数据
查看>>