【发布时间】:2020-07-18 14:03:36
【问题描述】:
我正在使用 React 构建一个 Web 应用程序。我已经将 React Lazy 与 Webpack 一起用于代码拆分,但我遇到了一个问题。如果我在页面 A 并访问另一个屏幕 (B),现在我重新访问最后一个屏幕 (A),屏幕将再次加载,并且组件 (A) 的 useEffect 挂钩中的 API 调用将再次执行。
我的应用没有会不断变化的数据,所以我不想一次又一次地调用它。我得出的结论是,当用户访问另一个屏幕时,React 会卸载前一个组件,而当用户再次访问时,它会安装该组件并执行 useEffect 钩子。
因此,我想避免不必要的 API 调用。我知道我可以缓存我的 API 调用,但这感觉像是一种解决方法。是否有更好的 API 缓存替代方案,或者我在代码中犯了一些错误?
我实现代码拆分的app.js文件:
const LoginContainer = lazy(()=> import('./Container/StudentDashboard.container'));
我的 StudentDashboard.container.js 文件:
const StudentDashboard = ()=>{
useEffect(()=>{
(async()=>{
const data = await fetch({...}) # this API call is executed every time user visits the screen
})
},[])
}
【问题讨论】:
-
尝试发送一个空的依赖数组到useEffect
-
@ludwiguer 它有一个空的依赖数组
-
是什么让您认为这与代码拆分有关?如果不使用惰性组件,它的行为是否相同?如果您的问题是组件正在卸载和重新安装,那么您将需要找到一种方法将状态保留在组件之外,以便在组件卸载时不会丢失。这里没有足够的信息来了解这两个组件是如何组成的,为什么
StudentDashboard可能会被卸载,以及该状态应该保存在哪里。 -
在代码被多次执行的情况下,我总是使用
console.log来了解双重订阅发生的位置。尝试将console.log放在您发送 api-call 的地方,一个放在订阅方法的地方,依此类推... -
@rfestag 没有惰性组件,屏幕永远不会卸载,api 调用不会多次执行
标签: javascript reactjs react-native react-hooks