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

问题

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

解决方式

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

自定义上传行为

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

template部分


  

以上是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部分


   
 

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。如有问题,请大家指教

更新

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

你可能感兴趣的:(vue)