实现验证输入验证码的功能
在这一步中,你将学习如何实现验证输入验证码的功能。请按照以下步骤完成此操作:
打开提供的项目中的 index.html
文件。
为 <template id="check">
部分添加绑定事件:
<!-- check -->
<template id="check">
<ul class="number">
<span>输入短信验证码</span>
<li class="hassend">已向 <i>{{handlePhoneVal}}</i> 发送验证码</li>
<li class="code-container">
<input type="number" class="code" min="0" max="9" required />
<input type="number" class="code" min="0" max="9" required />
<input type="number" class="code" min="0" max="9" required />
<input type="number" class="code" min="0" max="9" required />
<input type="number" class="code" min="0" max="9" required />
<input type="number" class="code" min="0" max="9" required />
</li>
<a href="javascript:;" id="resend" @click="resentCode">重新发送</a>
</ul>
</template>
<!-- check -->
在 check
组件中,添加必要的变量和函数:
app.component("check", {
template: "#check",
setup() {
// TODO
let phoneVal = inject("phoneVal"),
handlePhoneVal = inject("handlePhone")(phoneVal.value),
data = inject("data"),
code = inject("code"),
createCode = inject("createCode"),
rVal = "";
return {};
}
});
实现处理验证码输入的逻辑:
setTimeout(() => {
let oCodeIptList = [...document.getElementsByClassName("code")];
oCodeIptList[0].focus();
oCodeIptList.map((item) => {
item.oninput = function () {
if (item.value) {
item?.nextElementSibling && item?.nextElementSibling.focus();
} else {
item?.previousElementSibling && item?.previousElementSibling.focus();
}
rVal = (oCodeIptList.map((item) => item.value) + "").replaceAll(",", "");
trackVal(rVal);
};
});
function trackVal(val) {
if (val.length >= 6) {
if (val == code.value) {
ElNotification({
title: "验证成功",
message: "欢迎回来",
type: "success"
});
data.showName = "success";
} else {
ElNotification({
title: "验证失败",
message: "你输入的验证码不正确",
type: "error"
});
[...document.getElementsByClassName("code")].map(
(item) => (item.value = "")
);
[...document.getElementsByClassName("code")][0].focus();
}
}
}
});
在这段代码中,我们首先将焦点设置到第一个验证码输入框。然后,为每个输入框添加一个 oninput
事件处理程序。当用户输入值时,光标会自动跳转到下一个输入框。当用户删除值时,光标会自动跳转到上一个输入框。
我们还实现了 trackVal()
函数来验证输入的验证码。如果输入为6位且与生成的验证码匹配,我们会显示一个成功通知并将组件切换到 success
组件。如果输入不正确,我们会清空输入框并显示一个错误通知。
实现 resentCode()
函数以重新发送验证码,check
组件的所有代码如下:
app.component("check", {
template: "#check",
setup() {
// TODO
let phoneVal = inject("phoneVal"),
handlePhoneVal = inject("handlePhone")(phoneVal.value),
data = inject("data"),
code = inject("code"),
createCode = inject("createCode"),
rVal = "";
setTimeout(() => {
let oCodeIptList = [...document.getElementsByClassName("code")];
oCodeIptList[0].focus();
oCodeIptList.map((item) => {
item.oninput = function () {
if (item.value) {
item?.nextElementSibling && item?.nextElementSibling.focus();
} else {
item?.previousElementSibling &&
item?.previousElementSibling.focus();
}
rVal = (oCodeIptList.map((item) => item.value) + "").replaceAll(
",",
""
);
trackVal(rVal);
};
});
function trackVal(val) {
if (val.length >= 6) {
if (val == code.value) {
ElNotification({
title: "验证成功",
message: "欢迎回来",
type: "success"
});
data.showName = "success";
} else {
ElNotification({
title: "验证失败",
message: "你输入的验证码不正确",
type: "error"
});
[...document.getElementsByClassName("code")].map(
(item) => (item.value = "")
);
[...document.getElementsByClassName("code")][0].focus();
}
}
}
});
return {
handlePhoneVal,
resentCode() {
code.value = createCode();
ElNotification({
title: "发送成功",
message: "你的验证码是 " + code.value,
type: "success"
});
}
};
}
});
此函数会生成一个新的验证码并显示一个成功通知。
大功告成!你现在已经完成了使用手机号码验证码实现账户验证功能的操作。
最终效果如下: