根据密码中的数字和字符更新状态反应
updating state based on numbers and characters in passwords react
我正在尝试创建一些密码验证 UI 用于练习反应。
这意味着有效密码的凭据最初显示为红色,当用户创建密码时,他们将通过验证并变为绿色。
正常密码条件如:密码包含大写字母、数字、特殊字符。
这是保存我验证的所有密钥的状态:
const [valid, setValid] = useState({
uppercase: false,
specialChar: false,
number: false
});
输入状态控制的输入值:
const [input, setInput] = useState("");
<input
type="text"
className={validated ? "valid" : "not-valid"}
value={input}
onChange={(e) => handleChange(e.target.value)}
/>
我的调用验证器函数的 handleChange 函数
const handleChange = (e) => {
setInput(e);
validateNums(e);
};
到目前为止一切都很好。代码在我的 validateNums 函数期间失败。它可以与 if 语句中的任何一个一起使用,但不能同时与它们一起使用。这里出了什么问题,为什么?
const validateNums = (param) => {
for (const num in nums) {
if (param.includes(num)) {
setValid({ ...valid, number: true });
} else if (param.indexOf(num) === -1) {
setValid({ ...valid, number: false });
}
}
};
同时链接沙箱:
https://codesandbox.io/s/frosty-cache-6pmn8?file=/src/App.js:551-807
您的第二个验证函数将简单地用旧的 valid
状态覆盖您的状态,该状态没有考虑您刚刚更改的 valid
状态(您使用 validateNums 更改)。如果您 运行 在 validateCaps 函数之后使用 validateNums 函数,您会注意到 Number 验证有效,但 Caps 验证不符合预期。
有多种方法可以实现您想要的效果,例如基于承诺的调用;如果您想确保 运行 一个接一个地验证您的功能。在您的简单输入验证的特定情况下,根本不需要:最简单的是,您获取参数并设置一次有效状态。请参阅 validate
函数。
const validateNums = (param) => nums.some((num) => param.includes(num));
const validateCaps = (param) => caps.some((cap) => param.includes(cap));
const validate = (params) => {
setValid({
...valid,
number: validateNums(params),
uppercase: validateCaps(params)
});
};
const handleChange = (e) => {
setInput(e);
validate(e);
};
你看,我也简化了你的 validateNums
和你的 validateCaps
。提示:检查是否有其他方法可以检查数字或大写字母。
请在此处找到适合您的沙盒:
https://codesandbox.io/s/hopeful-brook-1wfu2?file=/src/App.js
我正在尝试创建一些密码验证 UI 用于练习反应。 这意味着有效密码的凭据最初显示为红色,当用户创建密码时,他们将通过验证并变为绿色。 正常密码条件如:密码包含大写字母、数字、特殊字符。
这是保存我验证的所有密钥的状态:
const [valid, setValid] = useState({
uppercase: false,
specialChar: false,
number: false
});
输入状态控制的输入值:
const [input, setInput] = useState("");
<input
type="text"
className={validated ? "valid" : "not-valid"}
value={input}
onChange={(e) => handleChange(e.target.value)}
/>
我的调用验证器函数的 handleChange 函数
const handleChange = (e) => {
setInput(e);
validateNums(e);
};
到目前为止一切都很好。代码在我的 validateNums 函数期间失败。它可以与 if 语句中的任何一个一起使用,但不能同时与它们一起使用。这里出了什么问题,为什么?
const validateNums = (param) => {
for (const num in nums) {
if (param.includes(num)) {
setValid({ ...valid, number: true });
} else if (param.indexOf(num) === -1) {
setValid({ ...valid, number: false });
}
}
};
同时链接沙箱: https://codesandbox.io/s/frosty-cache-6pmn8?file=/src/App.js:551-807
您的第二个验证函数将简单地用旧的 valid
状态覆盖您的状态,该状态没有考虑您刚刚更改的 valid
状态(您使用 validateNums 更改)。如果您 运行 在 validateCaps 函数之后使用 validateNums 函数,您会注意到 Number 验证有效,但 Caps 验证不符合预期。
有多种方法可以实现您想要的效果,例如基于承诺的调用;如果您想确保 运行 一个接一个地验证您的功能。在您的简单输入验证的特定情况下,根本不需要:最简单的是,您获取参数并设置一次有效状态。请参阅 validate
函数。
const validateNums = (param) => nums.some((num) => param.includes(num));
const validateCaps = (param) => caps.some((cap) => param.includes(cap));
const validate = (params) => {
setValid({
...valid,
number: validateNums(params),
uppercase: validateCaps(params)
});
};
const handleChange = (e) => {
setInput(e);
validate(e);
};
你看,我也简化了你的 validateNums
和你的 validateCaps
。提示:检查是否有其他方法可以检查数字或大写字母。
请在此处找到适合您的沙盒: https://codesandbox.io/s/hopeful-brook-1wfu2?file=/src/App.js