react下模擬上傳文件按鈕

實際開發中,往往上傳文件按鈕,經過ui設計一般會有一個好看的ui圖,
這是ui設計的,需要我們實現的
這時候往往會去看我們用的ui框架是否已經有類似的樣式,但是一般很難找到一樣的,這時候我們需要自己手寫,來模擬一個上傳文件的按鈕操作???
這裏使用原生input type=file實現,這裏在react框架項目中,代碼如下:

<div className={styles.fileName}>附件</div>
<div className={styles.fileArea} onClick={() => {
     let file = 'file_' + i
     this.refs[file].click()
}}>
	<p>+</p>
	<p>選取文件</p>
	<input type="file" ref={'file_' + i} style={{display: 'none'}} onChange={(e) => this.upload(e, i)}/>
</div>
{item.attachmentList && item.attachmentList.map((v, index) => {
return <div key={index} className={styles.fileInfo}>
	<div className={styles.fileItem}>{v.fileName.slice(0, 15) + '...'} 
	<span className={styles.deleteItem} onClick={() => this.deleteFile(v.id, i)}>×</span>
    </div>
 </div>
})}



// 
upload = (e, index) => {
    console.log(index)
    let file = e.target.files[0]
    let fileSize = (file.size) / 1024
    if (fileSize > 1024 * 20) {
      alert('文件大小不得超過 20M')
      return
    }
    let fileNameType = file.name.split('.').pop();
    let fileType = ['pdf', 'doc', 'docx', 'jpg', 'jpeg', 'JPG', 'JPEG', 'png', 'PNG']
    if (fileType.indexOf(fileNameType) < 0) {
      Toast.info('文件格式必須爲 pdf、jpg、png')
      return
    }
    let fileInfo = new FormData()
    if (file) {
      fileInfo.append('file', file)
      fileInfo.append('fileType', 'policy')
    }
    postFormData('/attachment/uploadOne', fileInfo).then((res) => {
        if (res.data.code === '00') {
          let state = this.state;
          console.log(index)
          state.bankInfoList[index].attachmentList.push(res.data.data)
          if (state.bankInfoList[index].attIdArray == null) {
            state.bankInfoList[index].attIdArray = []
            state.bankInfoList[index].attIdArray.push(res.data.data.id)
          } else {
            state.bankInfoList[index].attIdArray.push(res.data.data.id)
          }
          this.setState({state}, () => {
            setStore('bankInfoList', this.state.bankInfoList)
          });
          Toast.info(res.data.codeMsg)
        } else {
          Toast.info(res.data.codeMsg)
        }
      }
    )
  }


deleteFile = (id, index) => {
    let state = this.state;
    state.bankInfoList[index].attachmentList = state.bankInfoList[index].attachmentList.filter((item) => id !== item.id)
    state.bankInfoList[index].attIdArray = state.bankInfoList[index].attIdArray.filter((item) => id !== item)
    this.setState({state}, () => {
      setStore('bankInfoList', this.state.bankInfoList)
    });
    let fileEle = 'file_' + index
    this.refs[fileEle].value = null
  }

通過使用type=file隱藏該文件輸入,通過點擊選取文件來觸發其身上的onchange時間,事件處理過程都在input身上,這裏也實現了上傳成功後文件名展示和刪除文件功能,實現如下圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章