gpt4 book ai didi

reactjs - React - 在获取数据并使用该数据设置状态后如何清理 useEffect()?

转载 作者:行者123 更新时间:2023-12-01 21:34:43 24 4
gpt4 key购买 nike

我正在使用钩子(Hook) useEffect 向我的服务器发出获取请求,但我不断收到此警告:

警告:无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要修复,取消 useEffect 清理函数中的所有订阅和异步任务。

我明白这个警告的原因,但我该如何清除它?我尝试了本文中建议的方法,但没有成功:https://dev.to/pallymore/clean-up-async-requests-in-useeffect-hooks-90h

这是我的代码:

import React, { useEffect, useState } from 'react';
import { Redirect, Route } from 'react-router-dom';

export default function ProtectedRoute({ component: Component, ...rest }) {

const [ user, setUser ] = useState('');

useEffect(() => {
const fetchUser = async () => {
try {
const response = await fetch('http://localhost:5000/user', {
credentials: 'include'
});

const data = await response.json();

setUser(data.session.passport.user);

} catch (error) {
console.log(error);
}
}

fetchUser();

return () => {
// Do some cleanup
}
}, [])

return (
<Route { ...rest } render={ () => user ? <Component /> : <Redirect to="/login" /> }/>
)
}

感谢任何帮助:)

更新:感谢 Tony Nguyen 下面的解决方案,这是我的工作代码:

import React, { useEffect, useState } from 'react';
import { Redirect, Route } from 'react-router-dom';

import Loading from './Loading';
import Error from './Error';

export default function ProtectedRoute({ component: Component, ...rest }) {

const [ user, setUser ] = useState('');
const [ fetchingUser, setFetchingUser ] = useState(true);
const [ noError, setNoError ] = useState(true);

useEffect(() => {
const fetchUser = async () => {
try {
const response = await fetch('http://localhost:5000/user', {
credentials: 'include'
});

if (fetchingUser) {
const data = await response.json();
setUser(data.session.passport.user);
}

setFetchingUser(false);

} catch {
setNoError(false);
}
}

fetchUser();
}, [])

return (

<div>
<Route { ...rest } render={ () => { if (!noError) return <Error />} }/>
<Route { ...rest } render={ () => { if (fetchingUser && noError) return <Loading />} }/>
<Route { ...rest } render={ () => { if (user && !fetchingUser && noError) return <Component />} }/>
<Route { ...rest } render={ () => { if (!user && !fetchingUser && noError) return <Redirect to="/login" />} }/>
</div>
)
}

最佳答案

您的第一段代码没问题,只需要进行一些修改,即添加 fetchingUser 让组件知道您正在获取用户,不要重定向

import React, { useEffect, useState } from 'react';
import { Redirect, Route } from 'react-router-dom';

export default function ProtectedRoute({ component: Component, ...rest }) {
// add fetchingUser state with defaut is true
const [ fetchingUser, setFetchingUser ] = useState(true);
const [ user, setUser ] = useState('');

useEffect(() => {
const fetchUser = async () => {
try {
const response = await fetch('http://localhost:5000/user', {
credentials: 'include'
});

const data = await response.json();
setUser(data.session.passport.user);
// setFetching is false here
setFetchingUser(false)

} catch (error) {
// You can create an error state and set error here
console.log(error);
}
}

fetchUser();

return () => {
// Do some cleanup
}
}, [])


// add fetchingUser into conditions
// You can do better job that is if fetching show Loading component
// If error show error component
// if not fetching not error and have user show user component
// if not fetching not error and not user redirect to login
return (
<Route { ...rest } render={ () => user && !fetchingUser ? <Component /> : <Redirect to="/login" /> }/>
)
}

关于reactjs - React - 在获取数据并使用该数据设置状态后如何清理 useEffect()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62126754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com