element UI之from表单功能整合(图片校验,隐藏上传按钮(限制上传数量))
<el-dialog title="提示" :visible.sync="dialogVisible" width="30%"> <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> <el-form-item label="活动名称" prop="name"> <el-input v-model="ruleForm.name"></el-input> </el-form-item> <el-form-item label="活动区域" prop="region"> <el-select v-model="ruleForm.region" placeholder="请选择活动区域"> <el-option label="区域一" value="shanghai"></el-option> <el-option label="区域二" value="beijing"></el-option> </el-select> </el-form-item> <el-form-item label="活动时间" required> <el-col :span="11"> <el-form-item prop="date1"> <el-date-picker type="date" placeholder="选择日期" v-model="ruleForm.date1" style="width: 100%;"> </el-date-picker> </el-form-item> </el-col> <el-col class="line" :span="2">-</el-col> <el-col :span="11"> <el-form-item prop="date2"> <el-time-picker placeholder="选择时间" v-model="ruleForm.date2" style="width: 100%;"> </el-time-picker> </el-form-item> </el-col> </el-form-item> <el-form-item label="即时配送" prop="delivery"> <el-switch v-model="ruleForm.delivery"></el-switch> </el-form-item> <el-form-item label="活动性质" prop="type"> <el-checkbox-group v-model="ruleForm.type"> <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox> <el-checkbox label="地推活动" name="type"></el-checkbox> <el-checkbox label="线下主题活动" name="type"></el-checkbox> <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox> </el-checkbox-group> </el-form-item> <el-form-item label="特殊资源" prop="resource"> <el-radio-group v-model="ruleForm.resource"> <el-radio label="线上品牌商赞助"></el-radio> <el-radio label="线下场地免费"></el-radio> </el-radio-group> </el-form-item> <el-form-item label="活动形式" prop="desc"> <el-input type="textarea" v-model="ruleForm.desc"></el-input> </el-form-item> <el-form-item label="活动图片" prop="first_image_url" ref="image"> <el-upload :multiple="false" :before-upload="beforeUploadMainImage" :action="upload" :file-list="fileList" :on-success="uploadmainImageSuccess" :on-remove="handleRemove" :on-preview="handlePreview" :limit="1" accept=".jpg,.jpeg,.png,.gif,.JPG,.JPEG,.PNG,.GIF" list-type="picture-card" :class="{hide:hideUpload}" :on-change="onChange"> <!-- class="avatar-uploader" --> <i class="el-icon-plus avatar-uploader-icon" /> </el-upload> <!-- 预览图片 --> <el-dialog :visible.sync="pre_dialogVisible" append-to-body> <img width="100%" fit="contain" :src="dialogImageUrl" alt="" /> </el-dialog> </el-form-item> <el-form-item label="活动图片2" prop="first_image_url_two" ref="image"> <el-upload :multiple="false" :before-upload="beforeUploadMainImage" :action="upload" :file-list="fileList_two" :on-success="uploadmainImageSuccess" :on-remove="handleRemove" :on-preview="handlePreview" :limit="1" accept=".jpg,.jpeg,.png,.gif,.JPG,.JPEG,.PNG,.GIF" list-type="picture-card" :class="{hide:hideUpload}" :on-change="onChange"> <!-- class="avatar-uploader" --> <i class="el-icon-plus avatar-uploader-icon" /> </el-upload> <!-- 预览图片 --> <el-dialog :visible.sync="pre_dialogVisible" append-to-body> <img width="100%" fit="contain" :src="dialogImageUrl" alt="" /> </el-dialog> </el-form-item> <el-form-item> <div style="display: flex;"> <div style="margin-left: auto;"> <el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button> <el-button @click="resetForm('ruleForm')">重置</el-button> </div> </div> </el-form-item> </el-form> </el-dialog>
<script> export default { data() { var valiIcon = (rule, value, callback) => { if (!this.ruleForm.first_image_url) { callback(new Error('请上传活动图1')) } else { callback() } } var valiIcon_two = (rule, value, callback) => { if (!this.ruleForm.first_image_url_two) { callback(new Error('请上传活动图2')) } else { callback() } } return { url: "/user", name: "xiaoming", pwd: "123", pre_dialogVisible: false, dialogImageUrl: '', hideUpload: false, dialogVisible: true, ruleForm: { name: '', region: '', date1: '', date2: '', delivery: false, type: [], resource: '', desc: '', first_image_url:'', first_image_url_two:'' }, fileList: [{ name: 'food.jpeg', url: 'https://img1.baidu.com/it/u=3278473749,2160149519&fm=26&fmt=auto&gp=0.jpg' }], fileList_two: [{ name: 'food.jpeg', url: 'https://img1.baidu.com/it/u=3278473749,2160149519&fm=26&fmt=auto&gp=0.jpg' },{ name: 'food.jpeg', url: 'https://img1.baidu.com/it/u=3278473749,2160149519&fm=26&fmt=auto&gp=0.jpg' }], rules: { name: [{ required: true, message: '请输入活动名称', trigger: 'blur' }, { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' } ], region: [{ required: true, message: '请选择活动区域', trigger: 'change' }], date1: [{ type: 'date', required: true, message: '请选择日期', trigger: 'change' }], date2: [{ type: 'date', required: true, message: '请选择时间', trigger: 'change' }], type: [{ type: 'array', required: true, message: '请至少选择一个活动性质', trigger: 'change' }], resource: [{ required: true, message: '请选择活动资源', trigger: 'change' }], desc: [{ required: true, message: '请填写活动形式', trigger: 'blur' }], first_image_url: [{ required: true, validator: valiIcon }], first_image_url_two: [{ required: true, validator: valiIcon_two }], } } }, mounted() { this.hideUpload = this.fileList.length >= 1; let str=[],str_two=[]; //适用于点击修改页面(图片有值的情况下) this.fileList.map(item=>{str.push(item.url)}) this.ruleForm.first_image_url=str.toString(); this.fileList_two.map(item=>{str_two.push(item.url)}) this.ruleForm.first_image_url_two=str_two.toString(); console.log("this.ruleForm", this.ruleForm) }, methods: { //上传成功图片 uploadmainImageSuccess(res) { this.$refs.image.clearValidate() this.fileList = [{ name: 'food.jpeg', url: 'https://img1.baidu.com/it/u=3278473749,2160149519&fm=26&fmt=auto&gp=0.jpg' }] }, handleRemove(file) { this.fileList = '' this.hideUpload = this.fileList.length >= 1; this.$refs.image.validate() }, handlePreview(file) { console.log("file", file) this.dialogImageUrl = file.url this.pre_dialogVisible = true }, onChange() { this.hideUpload = this.fileList.length >= 1; }, submitForm(formName) { this.$refs[formName].validate((valid) => { if (valid) { alert('submit!'); } else { console.log('error submit!!'); return false; } }); }, resetForm(formName) { this.$refs[formName].resetFields(); } } } </script>
/deep/ .hide .el-upload--picture-card { display: none !important; }
//加上scope为当前页面生效