vue+elementui 封装表单自定义校验

这是一个使用Vue.js创建的交互式表单,包含多级选择(品牌、机型、故障类型)和地理位置(省、市)输入,以及电话和姓名字段。表单进行了详细的验证规则设置,包括必填项和格式验证,如电话号码的正确格式。用户可以填写额外的故障描述,并通过点击按钮进行表单提交和重置操作。
摘要由CSDN通过智能技术生成
<!-- 子组件 -->

<template>
	<div>
		<el-form label-position="left" :model="ruleForm"
		:rules="rules" ref="ruleForm" label-width="110px" class="demo-ruleForm">
		
			<el-form-item label="选择设备故障:" prop="region1" style="display: inline-block;">
				<el-select v-model="ruleForm.region1" placeholder="请选择品牌">
				    <el-option
				      v-for="item in options"
				      :key="item.value"
				      :label="item.label"
				      :value="item.value">
				    </el-option>
				</el-select>
			</el-form-item>
				
			<el-form-item prop="region2" style="display: inline-block;margin-left: -100px;">
				<el-select v-model="ruleForm.region2" placeholder="请选择机型">
				    <el-option
				      v-for="item in options"
				      :key="item.value"
				      :label="item.label"
				      :value="item.value">
				    </el-option>
				</el-select>
			</el-form-item>
				
			<el-form-item prop="region3" style="display: inline-block;margin-left: -100px;">
				<el-select v-model="ruleForm.region3" placeholder="请选择故障类型">
				    <el-option
				      v-for="item in options"
				      :key="item.value"
				      :label="item.label"
				      :value="item.value">
				    </el-option>
				</el-select>
			</el-form-item>
			
			<el-form-item>
				<p>如需要,可填写更多故障类型</p>
				<el-input
				  style="width: 500px;"
				  type="textarea"
				  placeholder="可填写更多故障现象"
				  v-model="textarea"
				  maxlength="100"
				  show-word-limit
				>
				</el-input>
			</el-form-item>
			
			<div>
				<el-form-item label="选择地区:" prop="province" style="display: inline-block;">
					<el-select v-model="ruleForm.province" placeholder="请选择省">
					    <el-option
					      v-for="item in options"
					      :key="item.value"
					      :label="item.label"
					      :value="item.value">
					    </el-option>
					</el-select>
				</el-form-item>
				<el-form-item prop="city" style="display: inline-block;margin-left: -100px;">
					<el-select v-model="ruleForm.city" placeholder="请选择市">
					    <el-option
					      v-for="item in options"
					      :key="item.value"
					      :label="item.label"
					      :value="item.value">
					    </el-option>
					</el-select>
				</el-form-item>
			</div>
			
			<el-form-item label="填写联系方式:" prop="tel" style="display: inline-block;">
				<el-input style="width: 200px;" v-model="ruleForm.tel" 
				placeholder="联系电话"></el-input>
			</el-form-item>
			<el-form-item prop="name" style="display: inline-block;margin-left: -100px;">
				<el-input style="width: 200px;" v-model="ruleForm.name" 
				placeholder="姓名"></el-input>
			</el-form-item>
			
			<el-form-item>
				<el-button type="primary" @click="submitForm('ruleForm')">确认预约</el-button>
				<el-button @click="resetForm('ruleForm')">重置</el-button>
			</el-form-item>
		</el-form>
	</div>
</template>

<script>
	//引入封装的表单验证
	import Format from '@/utils/validator.js'
	export default{
		data(){
			return{
				ruleForm: {
					region1: '',
					region2: '',
					region3: '',
					province: '',
					city: '',
					tel: '',
					name: '',
				},
				rules: {
					region1: [
						{ required: true, message: '请选择品牌', trigger: 'change' }
					],
					region2: [
						{ required: true, message: '请选择机型', trigger: 'change' }
					],
					region3: [
						{ required: true, message: '请选择故障类型', trigger: 'change' }
					],
					province: [
						{ required: true, message: '请选择省', trigger: 'change' }
					],
					city: [
						{ required: true, message: '请选择市', trigger: 'change' }
					],
					tel: [//使用自定义验证
						{ required: true,validator: Format.FormValidate.Form().Tel,trigger: 'blur' }
					],
					name: [
						{ required: true, message: '请输入姓名', trigger: 'blur' },
						{ min: 2, max: 6, message: '长度在 2 到 6 个字符', trigger: 'blur' }
					],
				},
				options: [
					{
						value: '选项1',
						label: '黄金糕'
					}, {
						value: '选项2',
						label: '双皮奶'
					}, {
						value: '选项3',
						label: '蚵仔煎'
					}, {
						value: '选项4',
						label: '龙须面'
					}, {
						value: '选项5',
						label: '北京烤鸭'
					}
				],
				text: '',
				textarea: '',
			}
		},
		methods:{
			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>

<style lang="scss" scoped>
</style>
//utils/validator.js

let regId = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
let email = /^(\w+\.?)*\w+@(?:\w+\.)\w+$/ //邮箱
let tel = /^1[3456789]\d{9}$/ //手机号码
let fax = /^(\d{3,4}-)?\d{7,8}$/ //传真
let name = /^[\u4E00-\u9FA5\uf900-\ufa2d·s]{2,10}$/; //姓名
let FormValidate = (function() {
	// eslint-disable-next-line
	function FormValidate() {}
	// From表单验证规则  可用于公用的校验部分
	FormValidate.Form = function() {
		return {
			// 姓名的验证规则
			Name: function(rule, value, callback) {
				if (!value) {
					return callback(new Error('姓名不能为空'))
				}
				if (!name.test(value)) {
					callback(new Error('请输入正确姓名!'))
				} else {
					callback()
				}
			},
			// 邮箱的正则
			Email: function(rule, value, callback) {
				if (!value) {
					return callback(new Error('邮箱不能为空'))
				}
				if (!email.test(value)) {
					callback(new Error('请输入正确的邮箱!'))
				} else {
					callback()
				}
			},
			// 身份证的验证规则
			ID: function(rule, value, callback) {
				if (!value) {
					return callback(new Error('身份证不能为空'))
				}
				if (!regId.test(value)) {
					callback(new Error('请输入正确的二代身份证号码'))
				} else {
					callback()
				}
			},
			// 电话号码的验证
			Tel: (rule, value, callback) => {
				if (!value) {
					return callback(new Error('电话不能为空'))
				}
				if (!tel.test(value)) {
					callback(new Error('请正确填写电话号码'))
				} else {
					callback()
				}
			}
		}
	}

	// FromOne表单验证规则  用于FromOne个性化的校验
	FormValidate.FormOne = function() {
		return {
			// 姓名的验证规则
			Name: function(rule, value, callback) {
				if (!value) {
					return callback(new Error('姓名不能为空'))
				}
				if (!name.test(value)) {
					callback(new Error('请输入正确姓名!'))
				} else {
					callback()
				}
			}
		}
	}
	return FormValidate
}())
exports.FormValidate = FormValidate

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue ElementUI提供了丰富的表单组件,但是在实际开发,我们可能需要对表单进行封装,以便于复用和统一管理。以下是一些封装表单的思路: 1. 将表单组件封装成一个单独的组件,包括表单项、校验规则、提交事件等。这样可以将表单的逻辑和UI分离,方便维护和修改。 2. 使用插槽(slot)来动态渲染表单项,可以根据需要添加、删除、修改表单项,提高表单的灵活性。 3. 将表单项的校验规则封装成一个单独的对象,可以在多个表单复用,减少代码冗余。 4. 使用v-model来双向绑定表单数据,方便获取和提交表单数据。 5. 使用ElementUI提供的表单验证规则,可以快速实现表单校验功能,减少开发时间和代码量。 总之,封装表单可以提高代码的复用性和可维护性,同时也可以提高开发效率和代码质量。 ### 回答2: Vue是一个流行的前端框架,Element UI则是一个基于Vue框架的UI库。在Vue应用程序使用Element UI封装form表单,可以简化表单的开发流程,并且可以提供一致性的UI风格。 Element UI提供了大量的表单组件,如输入框、下拉框、日期选择等。在Vue使用Element UI表单组件,需要对其进行封装,以便可以更方便地使用。 首先,在Vue组件引入ElementUI库,可以通过install方法进行注册。在组件注册可以方便使用,同时也可以控制内部封装实现,让表单组件更加灵活地适应业务场景。 其次,需要定义表单数据模型,可以使用组件的data对象来定义,每个数据字段对应一个表单输入框。将表单数据模型和Element UI组件双向绑定,可以实现对表单数据的自动更新。 然后,定义表单校验规则,可以使用Element UI提供的Validator组件,同时也可以自定义校验规则。在提交表单前进行表单校验,可以避免用户输入不合法数据造成数据异常。 最后,封装表单提交方法,可以使用Vue的methods方法进行实现。在提交表单时,需要将表单数据转换为JSON格式,以便可以进行后续处理。 综上所述,通过对Element UI表单组件进行封装,可以实现更加便捷、高效、可维护的表单开发。同时,也可以提高用户体验,降低用户输入错误的概率,提高数据的准确性和可靠性。 ### 回答3: Vue ElementUI是一套基于Vue.js的UI组件库,它的封装了丰富的组件和样式,使得我们在编写前端页面时可以快速搭建页面、提高开发效率。其Form表单组件是最常用的之一。 在Vue Element UI使用Form表单组件时,我们往往会发现它所提供的属性和方法已经足够满足我们大部分的需求。但是,在实际开发,我们可能会遇到一些特殊的需求,需要封装一些自定义的逻辑和验证规则,比如异步校验、业务逻辑校验。这时候,我们就需要对Vue ELementUIForm表单组件进行封装封装Form表单组件的目的就是为了封装我们常用的数据校验、提交等逻辑,提高代码的重用性和可维护性。在封装时,我们需要考虑以下几个方面: 1.表单数据的绑定: 在封装时,我们需要考虑表单数据的双向绑定,通常我们会将表单数据绑定在组件的数据对象,并且在数据对象提供一个reset方法,用于重置表单数据。 2.验证规则的扩展: 在Vue Element UI,每个表单控件都可以设置相应的验证规则,比如必填、邮箱、手机号等等,但是有时候我们会遇到一些特殊的需求,比如异步校验、业务逻辑校验等,我们需要对这些验证进行特殊处理,可以通过自定义的验证方法来实现。 3.表单提交: 封装表单的最终目的就是为了实现表单的提交,并处理提交的结果。我们可以将表单的提交和结果处理封装成方法,并以事件的形式发布出去,供父组件调用。 综上所述,封装Vue ElementUIForm表单组件可以帮助我们提高代码的重用性和可维护性,减少代码的重复编写。同时,也可以使得我们的前端页面开发更加高效,更好地实现页面交互效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值