React Native setTimeout - 如何清除超时
React Native setTimeout - How to clearTimeout
我在 useEffect 之外有一个 setTimeout 调用,如何在屏幕卸载时清除超时?
例如,我有一个功能组件,里面有这个...
...
useEffect(() => {
return () => clearTimeout(myTimeout)
}, [])
_getData = () => {
fetch()
.then(data => {
let myTimeout = setTimeout(() => setSomething(!something), 5000)
})
}
所以在代码后面的某个地方我调用了 _getData() - 我不希望它 运行 在页面首次加载时使用 useEffect,只有在执行某些操作时。获取数据后,我设置超时。但是 useEffect 并不知道这个超时。
我试过这样设置超时...
_getData...
setTimeoutVar(setTimeout(() => setSomething(!something), 5000))
useEffect...
return () => clearTimeout(setTimeoutVar)
我尝试了其他一些奇怪的想法,但没有任何效果,我想不通这个。
想法?
一整天都在研究这个问题 - 在 Whosebug 上写一个问题并在两分钟内解决。疯了!
这个问题的答案是将一个变量设置为false,然后在取回数据时更改该变量。然后有一个单独的 useEffect() 函数只处理这个。当变量改变时它运行。如果变量为 true - 设置超时和 useEffect 函数 returns clearTimeout...
const [refresh, setRefresh] = useState(false)
useEffect(() => {
let timeoutVariable
if(refresh){
timeoutVariable = setTimeout(() => setRefresh(false), 5000)
}
return () => clearTimeout(timeoutVariable)
}, [refresh])
_getData = () => {
fetch()
.then(data => {
setRefresh(true)
})
}
我在 useEffect 之外有一个 setTimeout 调用,如何在屏幕卸载时清除超时?
例如,我有一个功能组件,里面有这个...
...
useEffect(() => {
return () => clearTimeout(myTimeout)
}, [])
_getData = () => {
fetch()
.then(data => {
let myTimeout = setTimeout(() => setSomething(!something), 5000)
})
}
所以在代码后面的某个地方我调用了 _getData() - 我不希望它 运行 在页面首次加载时使用 useEffect,只有在执行某些操作时。获取数据后,我设置超时。但是 useEffect 并不知道这个超时。
我试过这样设置超时...
_getData...
setTimeoutVar(setTimeout(() => setSomething(!something), 5000))
useEffect...
return () => clearTimeout(setTimeoutVar)
我尝试了其他一些奇怪的想法,但没有任何效果,我想不通这个。
想法?
一整天都在研究这个问题 - 在 Whosebug 上写一个问题并在两分钟内解决。疯了!
这个问题的答案是将一个变量设置为false,然后在取回数据时更改该变量。然后有一个单独的 useEffect() 函数只处理这个。当变量改变时它运行。如果变量为 true - 设置超时和 useEffect 函数 returns clearTimeout...
const [refresh, setRefresh] = useState(false)
useEffect(() => {
let timeoutVariable
if(refresh){
timeoutVariable = setTimeout(() => setRefresh(false), 5000)
}
return () => clearTimeout(timeoutVariable)
}, [refresh])
_getData = () => {
fetch()
.then(data => {
setRefresh(true)
})
}