javascript - 反应功能的计时器未正确启动
问题描述
我正在尝试计算用户在测验中回答问题所需的时间。
当前代码看起来像这样
function Answer({ currentQuestion, submitAnswer }) {
var start = Date.now();
const inputsRef = useRef();
// const [secondsRemaining, setSecondsRemaining] = useState(0)
const handleInput = (e) => {
let value = e.target.value;
let nth = parseInt(e.target.dataset.nth, 10);
if (value === "") return;
let inputs = inputsRef.current.querySelectorAll("input");
inputs.forEach((element) => {
if (parseInt(element.dataset.nth, 10) === nth + 1) {
element.focus();
element.select();
}
});
};
const handleSubmit = () => {
let finalValue = "";
const finished = Date.now()
const secondsCompleted = finished - start;
let seconds = Math.floor((secondsCompleted / 1000) % 60);
console.log( seconds)
let inputs = inputsRef.current.querySelectorAll("input");
inputs.forEach((element) => (finalValue += element.value));
finalValue = finalValue.toUpperCase();
submitAnswer(finalValue);
};
useEffect(() => {
inputsRef.current.querySelectorAll("input")[0].focus();
}, []);
return (
<div>
<div
ref={inputsRef}
className="input-container flex justify-center flex-wrap"
>
{.... <input.../>}
....
);
}
目前,计时器仅在用户将值输入输入表单时才开始。
当这个函数呈现时,我怎样才能让它启动?
解决方案
您应该在组件中使用状态作为开始,因为每次应用程序内部有更新时,它都会改变,并且永远不会是用户开始看到问题的正确时间。并且您应该添加 useEffect 以检查问题何时更改并更新开始时间。你应该这样:
const [start, setStart] = useState();
useEffect(() => {
setStart(Date.now());
}, [currentQuestion])
推荐阅读
- c++ - 程序中的输入和输出
- c++ - 为什么我可以访问其他班级的私人成员?
- typescript - Vue.js 中奇怪的“无限更新循环”
- types - 不同 ocaml 模块中的相同类型不匹配
- angular - 如何在 Typescript 中的字符串中添加新行 - Angular 8
- python - 在属于类的函数内定义变量
- python - 如何在python中设置超时并打印时间倒计时
- angular - 发生错误:无法读取 null 的属性“nativeElement”
- google-apps-script - 自动更改 Google 表单回复的日期格式
- mysql - docker 中的 MySQL 不会保留对已配置卷的更改