1 问题描述
- 现状
在表单中有一项上传文件的功能,在未选择文件之前,对表单进行校验,提示文件未上传,需上传文件;选择文件但未上传,对表单进行校验,依旧提示文件未上传,需上传文件。
未上传文件之前的校验结果
上传文件之后的校验结果
- 期望
在未选择文件之前,对表单进行校验,提示文件未上传,需上传文件;选择文件但未上传,对表单进行校验,应该通过校验。
2 解决思路
2.1 被忽略的但对解决该问题很有用的ElementUI
功能
-
el-upload
组件有多个函数钩子来反馈文件上传/删除的状态,其中:on-change
表示文件状态改变时的钩子,on-remove
表示文件列表移除文件时的钩子。 -
el-form
组件校验规则除了validate
方法外,还有一个方法validateField
,用于对部分表单字段进行校验的方法
2.2 解决方法
- 上传文件时,在
el-upload
的on-change
钩子函数中,保存上传的文件,并调用el-form
的validateField
函数对el-upload
绑定的prop
字段进行校验 - 文件列表移除文件时,在
el-upload
的on-remove
钩子函数中,如果fileList
为空,设置相应的prop
的值为空,并调用el-form的
validateField函数对
el-upload绑定的
prop`字段进行校验
3 代码实现
<template>
<el-form ref="exampleForm" :model="formModel" :rules="rules">
<el-form-item label="上传文件" prop="file">
<el-upload
ref="fileUpload"
:action="fileUploadUrl"
:auto-upload="false"
:on-change="fileChange"
:on-remove="fileRemove"
:file-list="fileList"
:limit="1"
accept=".doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf">
<el-button slot="trigger" type="primary" size="small">选择文件</el-button>
<span slot="tip" style="margin-left: 20px">只能上传doc/docx/xls/xlsx/ppt/pptx/pdf文件</span>
</el-upload>
</el-form-item>
</el-form>
</template>
<script>
export default {
name: 'ExampleForm',
data () {
return {
formModel: {
file: null
},
rules: {
file: [
{
required: true,
message: '请至少选择一个产品标签',
trigger: 'change'
}
]
},
fileUploadUrl: "文件上传的URL地址"
}
},
methods: {
fileChange(uploadFile, fileList) {
this.formModel.file = uploadFile
if (fileList.length !== 0) {
this.$refs.exampleForm.validateField('file')
}
},
fileRemove(uploadFile, fileList) {
if (fileList.length === 0) {
this.formModel.file = null
this.$refs.exampleForm.validateField('file')
}
}
}
}
</script>