反应18严格的模式,导致组件渲染两次
React版本18 中严格模式的更改导致我的代码渲染两次,这会导致 Axios 中止控制器的错误,但我不知道如何清除错误在应用程序呈现两次之后的浏览器控制台。
请注意:我正在研究注册 /登录应用程序,即使我成功登录后, react < / strong>将我带回登录页面,因为 axios < /strong>错误
useEffect(() => {
let isMounted = true;
// used by axios to cancel request
const controller = new AbortController();
const getGoals = async () => {
try {
const response = await goalPrivate.get("/goals", {
// option to cancel request
signal: controller.signal
})
console.log(response?.data);
// set goals state when component mounts
isMounted && setGoals(response?.data);
} catch (error) {
console.log(error.message);
// when refreshToken expires
navigate("/login", { state: { from: location }, replace: true });
}
}
getGoals();
// cleanup function
return () => {
// don't set state if component unmounts
isMounted = false;
// cancel request if component unmounts
controller.abort();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
React strictMode调用所有效果的所有效果两次,以确保其清理/卸载处理程序按预期工作。即使他们有空的依赖列表,并且通常不会在网站关闭之前卸载,您可能需要相应地更改效果。
请注意,这仅发生在严格 +开发模式下。在生产构建中,效果只会在其依赖性变化时一次调用。
前上下文,请参见 https://reactjs.s.s.org/strict-ocs/strict-coms/strict-com- mode.html#确保可调用状态
React StrictMode calls all Effects twice to make sure their cleanup/unmount handlers work as intended. You may need to change your effects accordingly, even if they have an empty dependency list and would normally not unmount before the site is closed.
Note, this only happens in Strict + development mode. In a production build, effects will only be called once and when their dependencies change.
Fore more context, see https://reactjs.org/docs/strict-mode.html#ensuring-reusable-state
有相同的问题并以这种方式修复。
当中止流行程序中流产时,您会跳到捕获量,因此您只需检查信号是否流产或不执行代码的其余部分即可。
Had the same problem and fixed it this way.
When the abortController is aborted you jump to the catch so you just check if the signal is aborted or not to execute the rest of your code.
React 18现在具有
strict.mode
,可以安装,卸载和重新安装组件,这会导致 abortController 在第一个删除上发出错误。请记住,只有在index.js中应用strict.mode时,才会在开发模式下发生。在开发模式中,我们可以检查该行为。React 18 now has
Strict.Mode
which can mount, unmount, and remount components which causes the abortController to issue an error on the first unmount. Remember, this only happens in development mode when Strict.Mode is applied in your index.js. We can check for that behaviour while in development-mode.如果您启用了严格模式,它将在开发模式上发射两倍的使用效果,以确保您知道可能出现的副作用。
If you have the StrictMode enabled, it will fire two times the useEffect on development mode to make sure that you are aware of the possible side-effects that could appear.
您应该对错误响应进行分类,取决于错误代码或HTTP状态代码。
例如:
You should classify the error response depends on error code or http status code.
Eg:
在搜索此问题时,我发现要克服此问题的最佳选择是:
参考:
https://blog.bitsrc.io/react-v18-0-useeffect-bug-why-do-effects-跑步twice-39babecede93
Searching about this issue, I found that the best options to overcome this are:
References:
https://javascript.plainenglish.io/react-18-useeffect-double-call-for-apis-emergency-fix-724b7ee6a646
https://blog.bitsrc.io/react-v18-0-useeffect-bug-why-do-effects-run-twice-39babecede93