写一个vue表单验证插件(vue-validate-easy)
需求
目标:简单易用可扩展
如何简单
开发者要做的
- 写了一个表单,指定一个name,指定其验证规则。
- 调用提交表单方法,可以获取验证成功后的数据。
- 调用重置表单方法重置表单
- 自定义验证方法
程序应该做的
- 获取表单元素,绑定事件
- 有输入时,获取表单值,使用开发者指定的规则进行验证,若验证错误给予错误提示。
实现方法
- 获取原生表单元素,vue指令获取到的是包裹原生表单元素的外层元素,这里我使用data-type属性来获取原生表单元素
- 验证规则,验证参数,自定义错误提示语 由 vue的指令值来获取
- 提交时,我们需要一个表单标识,这里我使用了data-scope属性来对表单进行分组
- 重置,通过data-scope重置整个表单
常用方法
- 懒验证,通过.lazy指令修饰符
- 远程验证, 通过async await
- 延时验证, .deay指令修饰符,和data-delay属性
- 表单主动验证,单字段主动验证
- 单字段表单重置
可扩展
- 错误消息自定义
- 验证方法自定义
- 错误提示处理自定义
- 自定义表单元素(不借助原生元素)
完成后的使用代码
// 你只要指定 data-scope data-name data-type v-validate-easy 这四个属性的值,然后通过调用this.V.$submit(scope)就可以进行提交表单了
<form>
<div class="my-form-group" data-scope="register" data-name="email" data-type="input"
v-validate-easy="[['required','邮箱为必填项目'],['email']]">
<label>
<div class="label">邮箱</div>
<input class="input" type="text" spellcheck="false" placeholder="请输入邮箱"/>
</label>
</div>
<div id="pwd" class="my-form-group" data-scope="register" data-name="password" data-type="input"
v-validate-easy="[['required','密码不能为空'],['password'],['maxLength',[32],'密码最长为32位']]">
<label>
<div class="label">密码</div>
<input class="input" type="text" spellcheck="false" placeholder="请再次输入密码"/>
</label>
</div>
<div class="my-form-group" data-scope="register" data-name="password" data-type="input"
v-validate-easy="[['required','确认密码不能为空'],['equalTo',['pwd'],'密码输入不一致']]">
<label>
<div class="label">确认密码</div>
<input class="input" type="text" spellcheck="false" placeholder="请输入邮箱"/>
</label>
</div>
<div class="btn-group">
<button class="my-btn" @click.prevent="submit('register')">注册</button>
<button class="my-btn" @click.prevent="reset('register')">重置</button>
</div>
</form>
methods: {
reset(scope) {
this.V.$reset(scope)
},
submit(scope) {
this.V.$submit(scope, (canSumit,data) => {
// canSumit为true时,则所有该scope的所有表单验证通过
if(!canSumit) return
// 发送请求
axios({ url: '/test',data, method: 'post'})
.then(() => {
// 成功响应处理
})
.catch(() => {
// 错误处理
})
})
}
},
对自定义组件使用,就更加简洁
<form>
<h3>用户登录</h3>
<my-input label="用户名" data-scope="login" data-name="username" v-validate-easy="[['required']]"></my-input>
<my-input label="密码" data-scope="login" type="password" data-name="pwd" v-validate-easy="[['required']]"></my-input>
<div class="btn-group">
<button class="my-btn" @click.prevent="submit('login')">登录</button>
<button class="my-btn" @click.prevent="reset('login')">重置</button>
</div>
</form>
vue-validate-easy github地址
欢迎大家star,对该项目有什么问题和建议,欢迎提issue