最终实现需求如下图:
form表单内容与重点人员图片同时上传且图片为必填项
分析弹框页需要解决的问题有:
1、表单内容的验证及必填项
2、新增和编辑用同一个组件如何处理数据
3、图片需要和信息一起传递(即不允许自动上传)
4、图片必填的验证问题
针对上述问题作出方案:
1、el-form的表单验证需要注意几个地方:
a:el-form-item的prop值需要和表单标签的v-model值保持一致
例如:
b:验证规则有直接用element官网提供的也有自定义的
例如:其中checkNumber就是自定义的验证数字的正则
rules: { // 表单验证
name: [
{ required: true, message: '必填项', trigger: 'blur' }
],
age: [
{ required: true, message: '必填项', trigger: 'blur' },
{ validator: checkNumber, trigger: 'blur' }
],
sex: [
{ required: true, message: '必填项', trigger: ['blur', 'change'] }
],
nationlity: [
{ required: true, message: '必填项', trigger: ['blur', 'change'] }
],
userType: [
{ required: true, message: '必填项', trigger: ['blur', 'change'] }
],
idCard: [
{ required: true, message: '必填项', trigger: 'blur' },
{ validator: checkIdCard, trigger: 'blur' }
],
registered: [
{ required: true, type: 'array', message: '必填项', trigger: ['blur', 'change'] }
],
registeredDetails: [
{ required: true, message: '必填项', trigger: 'blur' }
],
domicile: [
{ required: true, type: 'array', message: '必填项', trigger: ['blur', 'change'] }
],
domicileDetails: [
{ required: true, message: '必填项', trigger: 'blur' }
],
file: [
{ required: true, message: '请上传图片' }
],
plateNumber: [
{ validator: checkPlateNum, trigger: 'change' }
]
}
2、新增和编辑问题需要我们在打开组件的时候传递两个值
props: {
dialogType: { //是新增还是编辑,用于判断
type: String
},
keypersonList: { //表单的原始值
type: Object
}
}
3、图片和form表单内容一起上传
首先我们需要阻止图片的自动上传让它等到我们点击保存按钮的时候再一起传给后台
我们看这段代码就是图片上传组件
上传照片
action我们随便填一个就好,重点是这一句:before-upload="beforeupload"在图片上传之前执行beforeupload方法在里面return false就可以实现阻止upload自动上传
// 阻止upload的自己上传,进行再操作
beforeupload (file) {
this.formData.append('file', file)
return false
}
关于图片和表单文件一起上传我们选择了formData格式存储数据用于上传
选择了图片并填写必填信息之后点击保存进行上传操作,在onSubmit方法里把表单信息都append到formData里that.$refs.uploadxls.submit() // 提交时触发了before-upload函数--》完成图片的上传即执行beforeupload方法
4、图片必填的验证问题:
a、如果没有选择图片点击保存则图片提示:请上传图片
b、此时选择了图片则“请上传图片”消失
验证规则里有一条file就是做图片必填验证的
file: [
{ required: true, message: '请上传图片' }
]
c、在编辑重点人员信息时重点人员图片已存在没有进行图片上传操作此时点击保存应该不提示“请上传图片”,未解决这个问题我们在上传时添加判断:
如果是编辑信息且未进行过图片上传操作则去掉file验证
就是以下代码
that.rules.file = [{ required: true, message: '请上传图片' }]
if (that.dialogType !== 'add' && !this.doUpload) {
that.rules.file = []
that.$refs['uploadElement'].clearValidate()
}
整个弹框组件的代码如下:
上传照片
{{item.dataValue}}
移除
继续添加
{{addKeyPersonForm.updateTime}}
保存