dha*_*nc1 3 reactjs react-router
我想使用身份验证建立安全路由。我已经在 App.jsx 文件中定义了路由。我正在使用“路由”来定义要呈现的组件。
在 App.jsx 中
<Route
path='/dashboard'
exact={true}
render={(props) => <Dashboard {...props} user={user}
handleChildFunc={this.handleChildFunc}/>}
/>
Run Code Online (Sandbox Code Playgroud)
上面的代码没有任何问题。我想让它像下面一样安全。
<PrivateRoute
path='/dashboard'
exact={true}
render={(props) => <Dashboard {...props} user={user}
handleChildFunc={this.handleChildFunc}/>}
/>
Run Code Online (Sandbox Code Playgroud)
在 PrivateRoute.jsx 中
const PrivateRoute = ( props ) => {
const user = "token from cookie"; // i will fetch token stored in cookie
if(user !== null) {
return <Route />;
}
else {
return <Redirect to="login" />
}
}
Run Code Online (Sandbox Code Playgroud)
如果令牌存在,则呈现组件。否则,重定向到 /login。
你可以有你PrivateRoute喜欢的
<PrivateRoute
path='/dashboard'
exact={true}
component={Dashboard}
handleChildFunc={this.handleChildFunc}
/>
Run Code Online (Sandbox Code Playgroud)
const PrivateRoute = ({ component: Component, handleChildFunc, ...rest }) => {
const user = "token from cookie";
return <Route {...rest} render={(props) => (
user !== null
? <Component {...props} user={user} handleChildFunc={handleChildFunc}/>
: <Redirect to='/login' />
)}
/>
}
Run Code Online (Sandbox Code Playgroud)
接受的答案很好,但当我们需要组件反映 URL 的变化时,它并不能解决问题。
假设您的组件具有以下代码:
export const Customer = (props) => {
const history = useHistory();
...
}
Run Code Online (Sandbox Code Playgroud)
然后你改变你的网址:
const handleGoToPrev = () => {
history.push(`/app/customer/${prevId}`);
}
Run Code Online (Sandbox Code Playgroud)
import React from 'react';
import { Redirect, Route } from 'react-router-dom';
import store from '../store/store';
export const PrivateRoute = ({ component: Component, ...rest }) => {
let isLoggedIn = !!store.getState().data.user;
return (
<Route {...rest} render={props => isLoggedIn
? (
<Component key={props.match.params.id || 'empty'} {...props} />
) : (
<Redirect to={{ pathname: '/login', state: { from: props.location } }} />
)
} />
)
}
Run Code Online (Sandbox Code Playgroud)
<PrivateRoute exact path="/app/customer/:id" component={Customer} />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5562 次 |
| 最近记录: |