首页 |  我的博客 |  查看该博主内容分类 | 

el-upload如何灵活使用http-request自定义上传方法(2.0版)?

前言

在我使用1.0版本的过程中,还是过于繁琐了些。后来总结,主要是总放不下原el-upload组件自带的上传功能,原组件在没有选择文件时,使用event的submit()(如this.$refs.upload.submit())事件进行上传会根本没反应。既然如此,我们何必再使用他自带的上传功能(实际上,上传逻辑写在组件上也很丑),只需要把他当做获取到文件的一个工具即可。
点击查看1.0版本

思路

  1. el-upload组件自带上传的所有属性都不要,让它在选取和删除时,同步到要上传的数据中;
  2. 因为在el-upload组件上,我们已经同步好文件数据到我们要上传的uploadForm数据中,接下来只需要调用我们的上传逻辑直接上传就好。(相当于组件就给我们做好了要上传的数据,同时又避免了考虑用它自身上传逻辑带来的麻烦)。

运用示例

Html

最主要是利用选取(on-change)和删除(on-remove)两个属性。

  • 在更改时,上传对象uploadForm始终跟选择的文件同步(因为选择新文件就会触发on-change),就能保证选取的新文件始终在我的上传数据中。file.raw为on-change回调函数的二进制文件数据;
  • 在删除时,将file设置为空''

有一种特殊情况,就是没有变更文件时,只改了其他数据提交时可能会报错。我的解决办法是,可以在打开el-upload组件时,将uploadForm.file属性删除delete uploadForm.file,后端没有接收到该字段时,不再校验从而避免报错。

  • 上传图片版
<el-upload
	action=""
	list-type="picture-card"
	:file-list="fileList"
	:on-change="(file, fileList) => uploadForm.file = file.raw"
	:on-remove="(file, fileList) => uploadForm.file = ''"
	:auto-upload="false"
	:limit="1"
>
	<i class="el-icon-plus"></i>
</el-upload>
<el-button type="primary" @click="clickUpload('userForm', uploadForm)">点我上传</el-button>

<!-- 不使用它自带上传,可以省掉很多属性,目的是拿到文件即可 -->
<!-- :file-list="fileList"用来控制图片的显示,自己加一张图片的方法是fileList.push({url: 图片地址}),就会显示一张图片 -->

  • 上传文件版
<el-upload
	action=""
	:file-list="uploadForm.fileList"
	:on-change="(file, fileList) => uploadForm.fileList = fileList.map(file => file.raw)"
	:on-remove="(file, fileList) => uploadForm.fileList = fileList.map(file => file.raw)"
	:auto-upload="false"
	multiple
	drag
	ref="uploadForm"
>
	<i class="el-icon-upload"></i>
	<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
	<div class="el-upload__tip">单个文件最好不要超过10M</div>
</el-upload>
<el-button type="primary" @click="clickUpload('userForm', uploadForm)">点我上传</el-button>

JavaScript

data() {
	return {
		uploadForm: {
			file: null,
		},
	}
},
methods: {
	clickUpload(isAdd=true) {
		// 注意上传文件时,使用multipart/form-data的contentType内容格式
		this.$refs.uploadFormRef.validate(valid => {  // 校验数据,如果没有,可以不要
			if (!valid) return false
			// 直接交由自定义上传逻辑处理,这次不再使用它自带的上传功能
			if (isAdd){
				// 你的添加逻辑,只要将uploadForm的数据提交到你的后端处理即可
			}else{
				// 你的编辑时的逻辑,只要将uploadForm的数据提交到你的后端处理即可
			}
		}
	}
}

不明白的地方欢迎留言,我们一起探讨

posted @ 2023-04-28 20:12  Z哎呀  阅读(1785)  评论(0编辑  收藏  举报
// let homeEle = document.querySelector('body') // homeEle.setAttribute('id', 'particles-js') // /* ---- particles.js config ---- */ // particlesJS("particles-js", { // "particles": { // "number": { // "value": 380, // "density": { // "enable": true, // "value_area": 800 // } // }, // "color": { // "value": "#ffffff" // }, // "shape": { // "type": "circle", // "stroke": { // "width": 0, // "color": "#000000" // }, // "polygon": { // "nb_sides": 5 // }, // "image": { // "src": "img/github.svg", // "width": 100, // "height": 100 // } // }, // "opacity": { // "value": 0.5, // "random": false, // "anim": { // "enable": false, // "speed": 1, // "opacity_min": 0.1, // "sync": false // } // }, // "size": { // "value": 3, // "random": true, // "anim": { // "enable": false, // "speed": 40, // "size_min": 0.1, // "sync": false // } // }, // "line_linked": { // "enable": true, // "distance": 150, // "color": "#ffffff", // "opacity": 0.4, // "width": 1 // }, // "move": { // "enable": true, // "speed": 6, // "direction": "none", // "random": false, // "straight": false, // "out_mode": "out", // "bounce": false, // "attract": { // "enable": false, // "rotateX": 600, // "rotateY": 1200 // } // } // }, // "interactivity": { // "detect_on": "canvas", // "events": { // "onhover": { // "enable": true, // "mode": "grab" // }, // "onclick": { // "enable": true, // "mode": "push" // }, // "resize": true // }, // "modes": { // "grab": { // "distance": 140, // "line_linked": { // "opacity": 1 // } // }, // "bubble": { // "distance": 400, // "size": 40, // "duration": 2, // "opacity": 8, // "speed": 3 // }, // "repulse": { // "distance": 200, // "duration": 0.4 // }, // "push": { // "particles_nb": 4 // }, // "remove": { // "particles_nb": 2 // } // } // }, // "retina_detect": true // }); // var count_particles, stats, update; // stats = new Stats; // stats.setMode(0); // stats.domElement.style.position = 'absolute'; // stats.domElement.style.left = '0px'; // stats.domElement.style.top = '0px'; // document.body.appendChild(stats.domElement); // count_particles = document.querySelector('.js-count-particles'); // update = function() { // stats.begin(); // stats.end(); // if (window.pJSDom[0].pJS.particles && window.pJSDom[0].pJS.particles.array) { // count_particles.innerText = window.pJSDom[0].pJS.particles.array.length; // } // requestAnimationFrame(update); // }; // requestAnimationFrame(update);