React Router v5 的受保护路由不起作用
Protected routes for react router v5 isn't working
我正在尝试使用 react-router-dom v5 创建一个 protected/private 路由,就像这里的 link 一样,我只使用了我需要的代码 - Protected routes and authentication with React Router v5.
现在我需要两个组件相互保密
问题:从SignUp
组件中获取Home
组件后我可以返回SignUp
,但这不是我想要的.
注册当前是第一页(作为登录)。如果用户已经注册并出现在 Home
组件中,我不希望他返回到 sigh-up 组件。
工作网站项目在这里 - CodeSandbox
任何人都知道如何制作这两个组件 protected/private?
GuardedRoute.jsx
function GuardedRoute({ children, auth, ...rest }) {
return (
<Route
{...rest}
render={() => {
return auth === true ? children : <Redirect to="/signup" />;
}}
/>
);
}
export default GuardedRoute;
App.js
const App = () => {
const [userID, setUserID] = useState('');
const [userSignedUp, setIfSignUp] = useState(false);
return (
<div className="App-div">
<GuardedRoute exact path="/home" auth={userSignedUp}>
<Home userIDNumber={userID} setIfSignUp={setIfSignUp} />
</GuardedRoute>
<Switch>
<Route path="/signup">
<SignUp setUserNumber={setUserID} setIfSignUp={setIfSignUp} />
</Route>
</Switch>
</div>
);
};
export default App;
在发布您的答案之前,请在我的 codesandbox 中尝试您的任何解决方案,这样我们就不会只在理论上尝试解决方案而徒劳:)
您可以使 signup
路由仅在用户未登录时存在,然后使用将重定向到 /home
的包罗万象
<div className="App-div">
<Switch>
{!userSignedUp && (
<Route path="/signup">
<SignUp setUserNumber={setUserID} setIfSignUp={setIfSignUp} />
</Route>
)}
<GuardedRoute path="/home" auth={userSignedUp}>
<Home userIDNumber={userID} setIfSignUp={setIfSignUp} />
</GuardedRoute>
<Route path="/">
<Redirect to="/home" />
</Route>
</Switch>
</div>
更新示例:https://codesandbox.io/s/jolly-https-t7dmj?file=/src/containers/App.js
或者您可以将逻辑封装到另一个组件,例如 GuardedRoute
,假设 UnguardedRoute
如果用户已登录,它将重定向到某个地方。
我正在尝试使用 react-router-dom v5 创建一个 protected/private 路由,就像这里的 link 一样,我只使用了我需要的代码 - Protected routes and authentication with React Router v5.
现在我需要两个组件相互保密
问题:从SignUp
组件中获取Home
组件后我可以返回SignUp
,但这不是我想要的.
注册当前是第一页(作为登录)。如果用户已经注册并出现在 Home
组件中,我不希望他返回到 sigh-up 组件。
工作网站项目在这里 - CodeSandbox
任何人都知道如何制作这两个组件 protected/private?
GuardedRoute.jsx
function GuardedRoute({ children, auth, ...rest }) {
return (
<Route
{...rest}
render={() => {
return auth === true ? children : <Redirect to="/signup" />;
}}
/>
);
}
export default GuardedRoute;
App.js
const App = () => {
const [userID, setUserID] = useState('');
const [userSignedUp, setIfSignUp] = useState(false);
return (
<div className="App-div">
<GuardedRoute exact path="/home" auth={userSignedUp}>
<Home userIDNumber={userID} setIfSignUp={setIfSignUp} />
</GuardedRoute>
<Switch>
<Route path="/signup">
<SignUp setUserNumber={setUserID} setIfSignUp={setIfSignUp} />
</Route>
</Switch>
</div>
);
};
export default App;
在发布您的答案之前,请在我的 codesandbox 中尝试您的任何解决方案,这样我们就不会只在理论上尝试解决方案而徒劳:)
您可以使 signup
路由仅在用户未登录时存在,然后使用将重定向到 /home
<div className="App-div">
<Switch>
{!userSignedUp && (
<Route path="/signup">
<SignUp setUserNumber={setUserID} setIfSignUp={setIfSignUp} />
</Route>
)}
<GuardedRoute path="/home" auth={userSignedUp}>
<Home userIDNumber={userID} setIfSignUp={setIfSignUp} />
</GuardedRoute>
<Route path="/">
<Redirect to="/home" />
</Route>
</Switch>
</div>
更新示例:https://codesandbox.io/s/jolly-https-t7dmj?file=/src/containers/App.js
或者您可以将逻辑封装到另一个组件,例如 GuardedRoute
,假设 UnguardedRoute
如果用户已登录,它将重定向到某个地方。