可预览图片组件

38 篇文章 1 订阅
36 篇文章 1 订阅
/**
 * 可预览图片
 */
import React, { Component } from 'react';
import { ImagePicker } from 'antd-mobile';
import { Toast } from '@/pages/project/yjpt/components/PandaToast.jsx'
import envconfig from "@/envconfig/envconfig";
import Carousel, { ModalGateway, Modal } from 'react-images'

import './index.less';

class PicturePreview extends Component {

  static defaultProps = {
    label: '',
    name: '',
    value: '',
    placeholder: '',
    readOnly: 0
  }

  state = {
    isShowModal: false
  }

  toggleModal = () => {
    this.setState({
      isShowModal: !this.state.isShowModal
    })
  }

  mapUrl = (url) => {
    if(url.includes('base64')) {
      return url;
    }
    return `${envconfig.pandaURL}/cityinterface/rest/services/filedownload.svc/download${url}`;
  }

  handleChange = (files, type) => {
    if(type === 'add') {
      const len = files.length;
      const newFile = files[len - 1];
      this.uploadImage(newFile);
    } else if(type === 'remove') {
      const { value } = this.props;
      const urls = value.split(',');
      const removeUrl = urls.filter(url => !files.find(file => file.url === url));
      if(removeUrl.length > 0) {
        this.deleteImage(removeUrl[0]);
      }
    }
  }

  uploadImage = async (fileData) => {
    const { url, file } = fileData;
    const { upload, value, name, onChange } = this.props;
    const formData = new FormData();
    formData.append('filedata', file);
    const now = +new Date();
    const imgType = url.split(';')[0].split('/')[1] || 'png';
    const path = `/WebApp/${name}/${now}.${imgType}`;
    const params = {
      imagePath: path,
      data: formData
    }
    Toast.loading('图片上传中...', 0);
    const res = await upload(params);
    Toast.hide();
    if(res.success) {
      let newVal = '';
      if(value === '') {
        newVal = path;
      } else {
        newVal = value + ',' + path;
      }
      onChange && typeof onChange === 'function' && onChange(name, newVal);
    }
  }

  deleteImage = async (url) => {
    const { deleteImage, value, onChange, name } = this.props;
    const params = {
      imagePath: url
    };
    Toast.loading('图片删除中...', 0);
    const res = await deleteImage(params);
    Toast.hide();
    if(!!res.status) {
      const urls = value.split(',');
      const newUrls = urls.filter(u => u !== url);
      console.log(urls, newUrls, url);
      onChange && typeof onChange === 'function' && onChange(name, newUrls.join(','));
    }
  }

  render() {
    const { isShowModal } = this.state;
    const { label = '', name = '', value = '', placeholder = '', readOnly = 0, unit = '', max = 4 } = this.props;
    const files = value.split(',').filter(url => !!url).map(url => ({
      url: this.mapUrl(url)
    }));
    const views = files.map((item) => {
      return {
        src: item.url
      }
    })
    return (
      <div className={`PicturePreview`}>
        <div className="label">{label}</div>
        <ImagePicker
          files={files}
          onChange={this.handleChange}
          onImageClick={this.toggleModal}
          disableDelete={readOnly}
          selectable={(files.length < max) && !readOnly}
        />
        <ModalGateway>
          {isShowModal ? (
            <Modal onClose={this.toggleModal}>
              <Carousel views={views} />
            </Modal>
          ) : null}
        </ModalGateway>
      </div>
    );
  }
}

export default PicturePreview;
.PicturePreview {
  display: flex;
  align-items: center;
  height: 2rem;
  background-color: #FFFFFF;
  padding: 0 0.54rem 0 0.49rem;
  font-size: 0.42rem;

  .label {
    flex: 0 0 2.61rem;
    color: #2E2E2E;
  }

  .am-image-picker {
    flex: 1;
    height: 1.5rem;

    &-list {
      padding: 0;
      margin-bottom: 0;
    }
  }

  .value {
    display: flex;
    flex: 1;
    align-items: center;
    height: 100%;
    color: #333333;
    border: none;
    &.disabled {
      color: #666666;
      opacity: 1 !important; // 兼容ios
    }
  }

  .unit {
    margin-left: 0.2rem;
    opacity: 0.8;
  }
  
  input:-webkit-autofill {
    box-shadow: 0 0 1000px #FFFFFF inset;
  }
  input:disabled {
    background-color: #FFFFFF;
    color: #666666 !important;
    opacity: 1 !important; // 兼容ios
  }
  input:-ms-input-placeholder,
  input:-moz-placeholder,
  input:-webkit-input-placeholder {
    color: #C3C3C3;
  }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值