vue element-ui v-for循环el-upload上传图片 动态添加、删除方式
作者:杰瑞LJ
这篇文章主要介绍了vue element-ui v-for循环el-upload上传图片 动态添加、删除方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
element-ui v-for循环el-upload上传图片 动态添加、删除

表单元素
<el-row v-for="(v,i) in RecordOperation.imgList" :key="i">
<el-col :span='11'>
<el-form-item label="图片">
<el-upload
accept="image/jpeg,image/png"
class="avatar-uploader"
:action="uploadUrl()"
:show-file-list="false"
:on-success="dynamicPicSuccess.bind(null, {'index':i,'data':v})"
:before-upload="beforeUploadImageDynamicPic">
<img v-if="v.picUrl" :src="v.picUrl" class="avatar dynamic">
<i v-else class="el-icon-plus avatar-uploader-icon dynamic"></i>
</el-upload>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="图片介绍">
<el-input minlength="4" maxlength="20" v-model.trim="v.content"></el-input>
</el-form-item>
</el-col>
<el-col :span="2" align="right" v-show="RecordOperation.imgList.length<=2?false:true">
<el-button type="text" style="color:red;line-height:32px;" @click="delDynamicPic(i,RecordOperation.imgList)">删除</el-button>
</el-col>
</el-row>
图片上传验证,上传图片处理,删除图片
// 动态图片验证
beforeUploadImageDynamicPic(file){
var _this = this;
var isLt10M = file.size / 1024 / 1024 < 10;
if (['image/jpeg', 'image/png'].indexOf(file.type) == -1) {
_this.$message.error('请上传正确的图片格式');
return false;
}
if (!isLt10M) {
_this.$message.error('上传图片大小不能超过10MB哦!');
return false;
}
},
//动态图上传成功
dynamicPicSuccess(obj,res,file) {
var imgList = this.RecordOperation.imgList
var index = obj.index;
imgList[index].picUrl = res.data.filePath;
// 少于5张图时,自动添加一行
if(imgList.length<5)
imgList.push({content: '', picUrl: ""});
},
// 移除动态建设图片
delDynamicPic(i,list) {
this.$confirm('确认删除该条记录?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
list.splice(i, 1);
});
},
vue+Element-ui(el-upload) 上传图片/文件
文件上传时携带参数
文件上传时,想要在上传的时候携带参数,可直接使用:
:data={参数} ,参数为键值对的形式{key1:value1,key2:value2}
<el-upload
:data={pid:this.pid}
>
</el-upload>upload
open: 是否显示弹出层,该属性的值为布尔型,false表示不显示,true表示显示。title: 弹出层标题,该属性的值为字符串类型。updateSupport: 是否更新已经存在的用户数据,该属性的值为整型。若为0,则不更新;若为1,则更新。headers: 设置上传的请求头部,该属性的值为一个对象类型,包含了一个Authorization属性,在请求头部中将会添加Authorization属性的值为"Bearer "加上getToken()方法的返回值,此处的返回值就是token(根据自己需求改!)。url: 上传的地址,该属性的值为一个字符串类型,值process.env.VUE_APP_BASE_API + "/api/common/upload"。- 其中,process.env.VUE_APP_BASE_API是一个环境变量,其值在不同的环境中可能会有所不同,表示应用程序的基本API地址。
<el-upload
:headers="upload.headers"
:action="upload.url"
:on-success="handleFileSuccess"
list-type="picture-card"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:file-list="completionPhotoList"
:on-change="changeFile"
>
<i class="el-icon-plus"></i>
</el-upload>
<el-dialog :visible.sync="dialogVisible" :modal="false">
<img width="100%" :src="dialogImageUrl" alt="" />
</el-dialog>
<script>
export default {
data() {
return {
// 用户导入参数
upload: {
// 是否显示弹出层(用户导入)
open: false,
// 弹出层标题(用户导入)
title: "",
// 是否更新已经存在的用户数据
updateSupport: 0,
// 设置上传的请求头部
headers: { Authorization: "Bearer " + getToken() },
// 上传的地址
url: process.env.VUE_APP_BASE_API + "/api/common/upload",
},
}
}before-remove来阻止文件被删除的操作


<el-upload
:before-remove="beforeRemove"
>
</el-upload>
<script>
export default {
data() {
return {
};
},
methods: {
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${ file.name }?`);
},
}
}
</script>multiple、limit、on-exceed属性
给控件加了multiple属性,就表示可以多选;
通过limit设置多选的个数限制,当不需要多选(只想单选文件)时,不加multiple属性;
可多选,无个数限制,不设置limit这个属性即可;
on-exceed:超出限制时会调用此方法;
超出三个文件给予提示信息,如图:
![]()
<el-upload
multiple
:limit="3"
:on-exceed="handleExceed"
>
</el-upload>
<script>
export default {
data() {
return {
};
},
methods: {
handleExceed(files, fileList) {
this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
},
}
}
</script>before-upload属性以及on-success属性
注意auto-upload属性的坑::auto-upload="false"时,before-upload 不起作用;
为啥?
before-upload: 文件上传之前触发,指当文件已经被选中,提交时才会触发此事件auto-upload:设置为false时,选中文件不会触发上传事件
解决方法:
将before-upload里面要写的内容放到on-change事件中去实现
:auto-upload="false"设置为true
<el-upload class="avatar-uploader" action="https://jsonplaceholder.typicode.com/posts/" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload"> <img v-if="imageUrl" :src="imageUrl" class="avatar"> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload>
<script>
export default {
data() {
return {
imageUrl: ''
};
},
methods: {
handleAvatarSuccess(res, file) {
this.imageUrl = URL.createObjectURL(file.raw);
},
beforeAvatarUpload(file) {
const isJPG = file.type === 'image/jpeg';
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isJPG) {
this.$message.error('上传头像图片只能是 JPG 格式!');
}
if (!isLt2M) {
this.$message.error('上传头像图片大小不能超过 2MB!');
}
return isJPG && isLt2M;
}
}
}
</script>总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
