【发布时间】:2020-09-15 13:11:30
【问题描述】:
我有一个想要为其创建 PrivateRoutes 的 react 应用程序。以下是PrivateRoute.tsx文件:
import * as React from 'react';
import { Route,Redirect, RouteProps} from 'react-router-dom';
import { getToken } from '../../auth/auth';
interface PrivateRouteProps extends RouteProps {
component?: any;
children?: any;
}
const PrivateRoute = (props: PrivateRouteProps) => {
const { component: Component, children, ...rest } = props;
const [isAuthenticated, setAuth ] = useState(false);
useEffect(() => {
async function fetchToken() {
try {
const token = await getToken();
if (token && token.length) {
setAuth(true);
} else {
setAuth(false);
}
} catch(e) {
console.log(e);
setAuth(false);
}
}
fetchToken();
}, [isAuthenticated]);
return (
<Route
{...rest}
render={routeProps =>
isAuthenticated ? (
Component ? (
<Component {...routeProps} />
) : (
children
)
) : (
<Redirect
to={{
pathname: '/signin',
state: { from: routeProps.location },
}}
/>
)
}
/>
);
};
export default PrivateRoute;
以下是我在 App.tsx 文件中的路由设置
//...
const App = () => {
return (
<div className="application">
<Router>
<Switch>
<Route path="/signin" component={SignIn} />
<Route path="/signup" component={SignUp} />
<NavBar>
<Switch>
<PrivateRoute path="/tasks" component={Tasks}/>
<PrivateRoute path="/people" component={People}/>
</Switch>
</NavBar>
<Route component={NotFound} />
<Redirect from="/" to="/signin" exact={true} />
</Switch>
</Router>
</div>
);
};
export default App;
令牌存储在 LocalForage 中。上面的代码产生以下警告,我无法访问 PrivateRoutes。我怀疑这是因为组件在承诺得到解决并且令牌可用之前被返回。
Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
我会感谢有用的答案。
【问题讨论】:
标签: reactjs react-router react-router-dom react-typescript