卡比记账项目——表单验证

123 阅读2分钟

表单验证

上节已经完成了表单的响应数据绑定等内容。现在需要对这个用户提交的绑定进行验证。

由于用户可能通过回车等操作未使用按钮进行表单提交操作,所以我们在form标签上进行事件监听。

截屏2022-10-20 13.27.08.png 由于表单提交后会自动刷新的特性,所以添加一句e.preventDefault()阻止默认动作 截屏2022-10-20 13.27.16.png 可以看到这个对象是一个复杂对象,想要让他变成一个简单点的对象需要用到一个vue的API。 截屏2022-10-20 13.29.17.png

toRaw可以返回一个proxy对象的原始对象。

截屏2022-10-20 13.30.51.png 现在可以进行一个校验了,拿到这个formData来看这个formData是不是正确的。

进行校验

计算errors = validate(formData,rules)传一些规则 具体规则有哪些:

截屏2022-10-20 13.39.50.png

因为校验是由明确关系的,所以rules是一个数组。 在数组中具体描述校验的内容。 比如第一点要校验的是name,他是必须要填充的,正则表达式是1-4个任意字符 name有两个规则:首先是必须填,其次是1-4个正则 sign是必填项 错误error也是一个数组,

截屏2022-10-20 13.45.26.png 发现校验错误就会返回这个错误。

截屏2022-10-20 13.45.46.png

具体实现

单独实现一个validate函数 这个validate函数接受formData和rules两个参数。 先声明formData的类型:

截屏2022-10-20 14.21.27.png key是字符串,value是字符串、数组、空、甚至它自己。 声明rule的类型

截屏2022-10-20 14.23.13.png 二选一的操作用& rules是rule的数组

type Rules<T> = Rule<T>[]

通过发现formData和rules是有关联的,key必须是子集关系的,所以加一个泛型

截屏2022-10-20 14.26.38.png ts的语法规定在箭头函数中只写t是不认同的,需要写成extends的形式。这里面的t就代表了FData。

vilidata函数最终会返回一个error

截屏2022-10-20 14.30.00.png errors的key必须是T这个泛型中的key。 遍历rules,通过formData拿到对应value,然后分情况讨论,在required的情况下,如果value为空,在errors对应的key里面添加一个message。正则情况下,如果value存在且不能匹配规则中的正则,初始化error并添加一个message。

截屏2022-10-20 14.43.28.png

回到创建标签页面,想要把error的message展示出来,这里可以选择使用reactive。声明好类型,key是formData的key,value是字符串的数组 const errors = reactive<{ [k in keyof typeof formData]?: string[] }>({})

由于使用const进行声明,所以不能直接修改,但是可以通过Objeec.assign进行覆盖

Object.assign(errors,validate(formData,rules))

把得到的错误一个一个复制给errors。 每次校验前要对errors进行清空:

截屏2022-10-20 15.05.40.png 最后在对应的地方进行显示 标签错误:

<span>{errors['name'] ? errors['name'][0] : ' '}</span>

emoji没有选:

<span>{errors['sign'] ? errors['sign'][0] : ' '}</span>

image.png