javascript - React JS如何在输入字段中显示密码5秒然后隐藏?
问题描述
我有一个眼睛图标,它具有onClick
更改密码可见性的事件。只需单击眼睛按钮即可轻松使其可见或不可见。我用useState
它。但我只想显示密码 3 秒钟然后隐藏它。在这里,我面临一些麻烦。
const [showPassword, setShowPassword] = useState(false);
const handleHidePassword = () => {
setShowPassword(false);
};
var time;
const handleShowPassword = () => {
clearTimeout(time);
setShowPassword(true);
time = setTimeout(handleHidePassword, 3000);
};
实际上,这段代码有效,但有一个错误。如果我连续多次单击眼睛图标,密码会在 3000 毫秒后消失得更快。我知道问题是setTimeout
每次点击后都没有刷新。我试图通过添加来解决这个问题,clearTimeout(time);
但这没有帮助。
我是 JavaScript 新手,所以我期待收到一些可以理解的建议。
解决方案
您可以添加去抖动以防止用户向按钮发送垃圾邮件。或者,您可以使单击按钮将“显示计时器”重置为 3000 毫秒:
const [showPasswordTime, setShowPasswordTime] = useState(0);
const showPassword = Date.now() < showPasswordTime;
// Little hack to trigger a re-render of your component
// (just need to set this with a value different from last render)
const [, forceUpdate] = useState();
console.log("Render", showPasswordTime - Date.now(), showPassword);
const handleHidePassword = () => {
setShowPasswordTime(0);
};
const handleShowPassword = () => {
// Make it that the password will be hidden for at least 3000ms
setShowPasswordTime(Date.now() + 3000);
// Make your component re-render after 3000ms
// which will then check if `showPasswordTime` has passed or not.
// (setTimeout will wait *at least* 3000ms)
setTimeout(() => forceUpdate(Date.now()), 3000);
};
这样,您就不会在 3000 毫秒后“切换”可见性。您是说密码应该在(至少)接下来的 3000 毫秒内显示。你用setTimeout
withforceUpdate
告诉 React “在 3000 毫秒内重新渲染我的组件”来检查它。如果同时更改时间,它仍会保留显示的密码。
这种方法唯一的“坏”是如果您的用户在 3000 毫秒内多次按下按钮,您的组件将渲染多次,但这没关系。您应该假设您的组件可以随时重新渲染。
推荐阅读
- android - 将 Firebase 数据保存到设备
- google-colaboratory - 在 TPU 上训练时验证损失变为 nan 但在 GPU 上完全没问题
- android - 此过程中未初始化默认 FirebaseApp - React Native - 本地通知
- typescript - TypeScript - 字符串键接口的属性不作为字符串类型传递
- python - 拖放 gtk 文本视图
- compiler-construction - Bison 使用 %define api.pure full 没有 %union 而是使用 C++ 变体
- codeigniter - 如何使用 Codeigniter3 一次将图像输入到 2 个表中
- node.js - Docker 撰写连接被拒绝
- asp.net-core - URLRewrite 依赖于 Config 依赖注入/作用域服务的中间件。.Net 核心
- r - 检查每个条件是否有每个参与者的数据