【发布时间】:2020-08-23 11:27:10
【问题描述】:
因此,我构建了一个自定义挂钩来从 api 获取数据。代码如下:
export const useLambdaApi = () => {
const [data, setData] = useState()
const [isLoading, setIsLoading] = useState(false)
useEffect(() => {
const fetchData = async () => { ... }
fetchData();
},[isLoading]);
return [data, setIsLoading];
}
在组件中我需要我做的数据:
export default function Comp (props) {
const [data, setIsLoading] = useLambdaApi()
useEffect(() => {
const interval = setInterval(() => {
setIsLoading(true)
console.log(Date())
}, 10000);
return () => {
window.clearInterval(interval); // clear the interval in the cleanup function
};
},[data]);
return( ... )
}
但我得到一个类型错误:TypeError: setIsLoading is not a function
我知道这一定很愚蠢,但我对 React 比较陌生,所以任何反馈都会有很大帮助。
谢谢。
编辑:
为了提供更多上下文,我在我的组件片段中添加了更多代码。我尝试从setInterval 更新isLoading 状态。但我也确实从 useEffect 尝试过,没有间隔,并且在 useEffect 之外......
这是堆栈跟踪:
PatientBoard.js:26 Uncaught TypeError: setIsLoading is not a function
at PatientBoard.js:26
(anonymous) @ PatientBoard.js:26
setInterval (async)
(anonymous) @ PatientBoard.js:25
commitHookEffectList @ react-dom.development.js:21100
commitPassiveHookEffects @ react-dom.development.js:21133
callCallback @ react-dom.development.js:363
invokeGuardedCallbackDev @ react-dom.development.js:412
invokeGuardedCallback @ react-dom.development.js:466
flushPassiveEffectsImpl @ react-dom.development.js:24223
unstable_runWithPriority @ scheduler.development.js:676
runWithPriority$2 @ react-dom.development.js:11855
flushPassiveEffects @ react-dom.development.js:24194
(anonymous) @ react-dom.development.js:23755
scheduler_flushTaskAtPriority_Normal @ scheduler.development.js:451
flushTask @ scheduler.development.js:504
flushWork @ scheduler.development.js:637
performWorkUntilDeadline @ scheduler.development.js:238
【问题讨论】:
-
您的 sn-ps,尽管缺少一些细节,但对我来说似乎是合理的。除非您直接调用
setIsLoading并将其放在处理程序中,否则它应该可以正常工作。您可以分享堆栈跟踪或更多详细信息吗? -
感谢您的评论。我用堆栈跟踪和更多我从中调用函数的代码编辑了这个问题......计时器工作,状态
data带有获取数据,尽管如果Iog从该组件data控制台将未定义。我认为是因为获取需要时间,但如果我在计时器中每 10 秒记录一次数据,它总是未定义,这也让我觉得很奇怪。 -
使用您的 sn-ps 我仍然无法重现错误:codesandbox.io/s/wizardly-sutherland-93msc - 可能是您有条件地使用了钩子或有其他导致问题的副作用。
-
感谢您抽出宝贵时间使用代码和框...但是,可能是什么原因导致此问题?我刚刚开始这个项目,所以它只是几个组件,这是唯一一个导入该自定义钩子的组件。
标签: reactjs react-hooks use-state