如何使用 react-router 使用私有路由?

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。

rav*_*l91 5

你可以有你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)


Ale*_*man 3

接受的答案很好,但当我们需要组件反映 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)