React 使用antd imagePicker選擇并上傳圖片

注意:imagePicker只是圖片選擇器,一般用于上傳圖片前的文件選擇操作,但不包括圖片上傳的功能. 因?yàn)榉庋b了一個帶上傳的
上傳的核心是封裝好FormData

image.png
import React from 'react'
import { ImagePicker, Toast } from 'antd-mobile'
/**
      <AppImagePicker 
            initFiles={[{
            url: 'https://zos.alipayobjects.com/rmsportal/PZUUCKTRIHWiZSY.jpeg',
            id: '2121',
          }]}
            type='edit'
            maxLength={2}
            receiveNewFiles={(files)=>{console.log('new files', files)}}
          />
 */
interface ImagePickerState {
  files: any //[url,file, id]
}

interface ImagePickerProps {
  diyprops?: any
  type: 'display' | 'edit'
  initFiles?: any
  maxLength?: number
  receiveNewFiles?(files: any): void
}

class AppImagePicker extends React.Component<
  ImagePickerProps,
  ImagePickerState
> {
  constructor(props: ImagePickerProps) {
    super(props)
    this.state = {
      files: props.initFiles || []
    }
  }

  static getDerivedStateFromProps(props: ImagePickerProps, state: ImagePickerState) {
    if (!state.files || state.files.length == 0) {
      if (props.initFiles) {
        return {
          files: props.initFiles
        }
      }
    }
  }


  onChange = (files: any, type: any, index: any) => {
    const {
      receiveNewFiles
    } = this.props

    // 如果是添加,則獲取最后一個上傳
    if (type === 'add') {
      let currentFile = files[files.length - 1].file
      let formData = new FormData();
      formData.append("file", currentFile);
      fetch("xxxxxxxxx", {
        method: 'POST',
        headers: {
        },
        body: formData,
      }).then((response) => response.json())
        .then((responseData) => {
          if (responseData.content && responseData.content.downloadUrl) {
            currentFile.url = responseData.content.downloadUrl
            this.setState({
              files: files
            }, () => {
              receiveNewFiles && receiveNewFiles(files)
            });
          } else {
            files.splice(-1, 1)
            Toast.fail('圖片上傳失敗!')
          }
        }).catch((err) => {
          console.log(err)
          files.remove(-1, 1)
          Toast.fail('圖片上傳異常!')
        });
    } else {
      this.setState({
        files: files
      }, () => {
        receiveNewFiles && receiveNewFiles(files)
      });
    }
  }

  render() {
    const {
      diyprops,
      type,
      maxLength
    } = this.props

    const {
      files
    } = this.state

    return (
      <ImagePicker
        {...diyprops}
        files={files}
        selectable={type == 'edit' && (!maxLength || files.length < maxLength)}
        disableDelete={type != 'edit'}
        onChange={this.onChange}

      />
    )
  }
}

export default AppImagePicker

參考地址

使用antd-mobile的ImagePicker組件實(shí)現(xiàn)圖片的上傳

ImagePicker 圖片選擇器

e.target.files[0]層層剖析

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容