Vue Element Upload组件自定义上传行为及值回填

问题

由于项目使用element-ui,然后upload默认上传方式不支持我们现有接口。参照了一下官方API及相关博客,解决了我现有问题。

解决方式

  1. 自定义上传:upload组件提供了一个http-request属性,官方给的描述是:覆盖默认的上传行为,可以自定义上传的实现
  2. 值的回填:upload组件提供了一个file-list属性,描述:上传的文件列表
    #具体代码实现

自定义上传行为

这里使用图片上传作为实例

template部分
<el-upload
  action="https://up-z2.qbox.me"
  list-type="picture-card"
  :http-request="uploadImg"
  :on-success="uploadImgSuccess"
  :on-remove="handleRemove">
  <i class="el-icon-plus"></i>
</el-upload>

以上是template部分,我们实现了http-request, on-success, on-remove三个属性

script部分
methods: {
	uploadImg (f) {
	  this.axios.get('./getToken').then((response) => {//获取token
	     let param = new FormData(); //创建form对象
	     param.append('file',f.file);//通过append向form对象添加数据
	     param.append('token',response.data.token);//通过append向form对象添加数据
	     param.append('key',response.data.key);//添加form表单中其他数据
	     let config = {
	       headers:{'Content-Type':'multipart/form-data'}
	     };  //添加请求头
	     this.axios.post(f.action,param,config)//上传图片
	     .then(response=>{
	       f.onSuccess(response.data)
	     })
	     .catch(({err}) => {
	       f.onError()
	     })   
	   })
	   .catch(() => {
	     f.onError()
	   })
	 },
	 uploadImgSuccess(response, file, fileList) {
		 // 缓存接口调用所需的文件路径
		 console.log('文件上传成功')
	 },
	 handleRemove(file, fileList) {
		 // 更新缓存文件
		 console.log('文件删除')
	 }
}

值回填

同样以图片上传为例

template部分
<el-upload
   action="https://up-z2.qbox.me"
   list-type="picture-card"
   :http-request="uploadImg"
   :on-remove="handleRemove"
   :on-change="handleImgChange"
   :file-list="imgList">
   <i class="el-icon-plus"></i>
 </el-upload>
script部分
data() {
	return {
		imgList: [{url: '初始需回填的图片url', status: 'finished'}]
	}
},
methods: {
	uploadImg (f) {
      this.axios.get('./getToken').then((response) => {//获取token
         let param = new FormData(); //创建form对象
         param.append('file',f.file);//通过append向form对象添加数据
         param.append('token',response.data.token);//通过append向form对象添加数据
         param.append('key',response.data.key);//添加form表单中其他数据
         let config = {
           headers:{'Content-Type':'multipart/form-data'}
         };  //添加请求头
         this.axios.post(f.action,param,config)//上传图片
         .then(response=>{
           f.onSuccess(response.data)
         })
         .catch(({err}) => {
           f.onError()
         })   
       })
       .catch(() => {
         f.onError()
       })
     },
     handleImgChange (file, fileList) {// 这里可以打印file查看数据结构
	      if (file.response) {//判断是否上传成功
	        this.imgList.push({url: this.tools.cdn(file.response.key), status: 'finished'})//上传成功之后把值添加到imglist中
	      }
	},
    handleRemove (file, fileList) {// 这里可以打印filelist查看数据结构
      this.imgList = fileList//删除某张图片时重新对imglist赋值
    }
}

写在最后

一直想把这个记下来,比较懒惰一看好久没有写博客了。由于是在我们工程里改的,暂时还没有写demo。如有问题,请大家指教

更新

看到一些小伙伴反应的问题,验证之后也发现了一些问题,感谢各位的反馈

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值