介绍
在这个项目中,你将学习如何使用 Vue.js 实现一个自定义表单验证器。自定义表单验证器允许你在用户提交表单之前验证表单字段并检查数据的有效性。
👀 预览

🎯 任务
在这个项目中,你将学习:
- 如何实现
FormInput组件,以便在输入字段的值发生变化时更新组件的v-model值。 - 如何实现
is_email函数,根据特定规则验证电子邮件地址。 - 如何实现
validateForm函数,根据定义的验证规则验证表单数据。
🏆 成果
完成这个项目后,你将能够:
- 在 Vue.js 中创建一个自定义表单验证器。
- 使用自定义验证规则验证表单字段。
- 处理表单验证错误并将其显示给用户。
设置项目结构
在这一步中,你将设置项目文件和结构。请按照以下步骤完成此步骤:
打开项目文件夹。目录结构如下:
├── components
│ ├── FormInput.js
│ └── FormValidator.js
├── css
├── index.html
├── js
│ └── util.js
└── lib
└── vue.global.js
其中:
index.html是主页。css是用于存储项目样式的文件夹。lib是用于存储项目依赖项的文件夹。components/FormInput.js是input组件。components/FormValidator.js是表单验证器组件。js/util.js是项目所需的实用函数。
点击 WebIDE 右下角的 Go Live 按钮来运行项目。
接下来,在 VM 顶部打开“Web 8080”并手动刷新以查看页面。
实现 FormInput 组件
在这一步中,你将学习如何实现 FormInput 组件,以便在输入字段的值发生变化时,更新 index.html 中该组件的 v-model 值。
打开位于
components目录下的FormInput.js文件。在
FormInput组件的setup函数中,找到目标 1 的 TODO 部分。实现代码,以便在输入字段(类名为
form-input)的值发生变化时,触发一个事件来更新组件的v-model值。watch(inputValue, (newValue) => { emit("update:modelValue", newValue); });这段代码使用
watch函数来观察响应式变量inputValue的变化。当值发生变化时,它会发出一个包含新值的事件,以更新父组件中的v-model绑定。保存对
FormInput.js文件所做的更改。
实现 is_email 函数
在这一步中,你将学习如何在 util.js 文件中实现 is_email 函数来验证电子邮件地址。
打开位于
js目录下的util.js文件。在
is_email函数中,找到目标 2 的 TODO 部分。根据以下要求实现验证电子邮件地址的逻辑:
- 电子邮件地址必须在 6 到 20 个字符之间。
- 电子邮件地址必须由用户名部分和域名部分组成,中间用
@符号分隔。 - 用户名部分必须至少 1 个字符长,并且可以包含数字或字母。
- 域名部分必须在中间包含一个
.,并且.之前的部分必须至少 1 个字符长,而.之后的部分必须是 2 到 4 个字母。
以下是一个示例实现:
const is_email = (val) => { const emailRegex = /^[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z]{2,4}$/; return emailRegex.test(val); };保存对
util.js文件所做的更改。
实现 validateForm 函数
在这一步中,你将学习如何在 FormValidator.js 文件中实现 validateForm 函数来验证表单数据。
- 打开位于
components目录下的FormValidator.js文件。 - 在
validateForm函数中,找到目标 3 的 TODO 部分。 - 根据提供的
formRules对象实现验证表单数据的逻辑。验证应遵循以下规则:- 如果
nickname字段为空,在errors对象中添加一个键为"nickname"的错误消息。 - 对于
email字段:
- 如果字段为空,在
errors对象中添加一个键为"email"的错误消息。 - 如果电子邮件地址不符合规则或不在正确的长度范围内,在
errors对象中添加一个键为"email"的错误消息。
- 如果
以下是一个示例实现:
const validateForm = () => {
return new Promise((resolve, reject) => {
errors.value = {}; // 清除之前的错误消息
// 验证昵称
try {
props.rules.nickname.map((item) => {
item?.validator(null, props.formData.nickname, (err) => {
if (err) {
throw "nickname|" + err.message;
}
});
});
} catch (e) {
const parseErr = e.split("|"),
errKey = parseErr[0],
errValue = parseErr[1];
errors.value[errKey] = errValue;
}
// 验证电子邮件
try {
props.rules.email.map((item) => {
if (item?.required) {
if (props.formData.email == "") throw "email|" + item.message;
}
if (item?.type) {
if (!validateByType(item.type, props.formData.email))
throw "email|" + item.message;
if (props.formData.email.length < 6) throw "email|" + item.message;
if (props.formData.email.length > 20) throw "email|" + item.message;
}
});
} catch (e) {
const parseErr = e.split("|"),
errKey = parseErr[0],
errValue = parseErr[1];
errors.value[errKey] = errValue;
}
if (hasErrors.value) {
resolve(false); // 存在错误,验证失败
} else {
resolve(true);
}
emit("valid", errors.value);
});
};
- 保存对
FormValidator.js文件所做的更改。
恭喜!你现在已经完成了自定义表单验证器的实现。现在你可以通过运行项目并与表单进行交互来测试应用程序。完成后的效果如下:

总结
恭喜!你已完成此项目。你可以在 LabEx 中练习更多实验以提升技能。



