javascript - 反应钩子不起作用
问题描述
所以我在反应函数组件中得到了这个方法
let req = () => {
setLoading('fas fa-spinner fa-pulse fa-spinner')
setQuestion('')
setAnswer('')
setTimer(2) //set i here
setChoices([])
setDisplay('none')
setdisplayTimer('none')
fetch('https://opentdb.com/api.php?amount=1&category=9&type=boolean')
.then((res) => res.json())
.then(data => {
console.log(data.results[0])
let interval = setInterval(() => {
setdisplayTimer('block')
setTimer(timer--) //substract i here
if (timer < 0) {
clearInterval(interval)
setDisplay('block')
}
}, 1000);
console.log(timer)
setLoading('')
setAnswer(data.results[0].correct_answer)
setQuestion((data.results[0].question).replace(/"/g, '"').replace(/'s/g, "'s").replace(/"/g, '"').replace(/'t/, "'t").replace(/'/, "'"))
setChoices(['True', 'False'])
})
}
以前我也声明过const [timer, setTimer] = useState(4)
问题是当我第二次调用该方法时,我的钩子setTimer
仍然为 0,尽管我已经将它设置为初始值。谢谢你的任何建议!
解决方案
问题
您在间隔回调中有一个陈旧的timer
状态外壳。可能初始状态timer: 0
是封闭的,并且setTimer(2)
对以后timer
的值访问没有影响,因为它们使用了封闭的初始状态值。
解决方案
使用功能状态更新从先前的状态而不是更新排队的状态进行更新。
setTimer(timer => timer - 1)
推荐阅读
- r - R中用户函数的最大递归深度是多少?
- pyqt - 为什么 QFrame 边框在左侧和顶部被截断?
- advanced-rest-client - 16.0.0 中的全局请求超时是否中断?
- javascript - 元素的 innerText 不显示 var
- python - 获取其他元组中一个元组的值
- ruby - 你如何调用 ruby-git push 命令
和 选项? - go - 使用 AppEngine 从 Firestore 读取不一致
- sql - 在oracle中的选择上在一个字段中使用两个表
- canvas - 在 Safari 中将 Blob 加载到 img 时出错(WebKitBlobResource 错误 1。)
- python - 如何使用连续随机生成的字符将字符串填充到长度 = n?