【问题标题】:Having Issues trying to re-direct user based on state , using React-Router使用 React-Router 尝试根据 state 重定向用户时遇到问题
【发布时间】:2020-04-16 17:11:19
【问题描述】:

我的应用组件重定向一个使用过的,如果他们已经登录 = true,我在尝试了各种方法后使用了一个在线示例,如果有更简单的功能反应方式来做到这一点,请告诉我,

如果用户已登录,我希望他们转到 /createpost 否则我希望他们转到 /login 路由,我想保护用户必须登录的 /createpost 路由,但这是一项任务再一次,虽然想法很感激..

沙盒:https://codesandbox.io/s/focused-sammet-eitqr

我的应用组件

const App = () => {
  return (
    <Router>
      <Switch>
        <Route component={Navbar} />
        <Route exact path="/Home" component={Home} />
        <Route exact path="/posts" component={ViewPost} />
        <Route exact path="/login" component={Login} />
        <Route exact path="/register" component={Register} />

        <PrivateRoute
          path="/createpost"
          component={CreatePost}
          isAuthenticated={false}
        />
      </Switch>
    </Router>
  );
};

PrivateRoute 组件

export const PrivateRoute = ({
  component: Component,
  isAuthenticated,
  ...rest
}) => (
  <Route
    {...rest}
    render={props =>
      isAuthenticated ? (
        <Component {...props} />
      ) : (
        <Redirect
          to={{
            pathname: "/login",
            state: { from: props.location }
          }}
        />
      )
    }
  />
);

【问题讨论】:

  • 为了导入一个没有{ }s 的组件名称,你应该将它导出为default,你的代码框会抛出一个错误。看看这个:stackoverflow.com/q/31852933/4636715
  • 抱歉修正了,第一次错过。
  • 看看thisdemo
  • 真的很酷,谢谢

标签: javascript reactjs express react-router


【解决方案1】:

我是通过下面的代码做到的 -

import React, { Component } from 'react';
import { BrowserRouter, Route, Switch, Redirect } from 'react-router-dom';
import { baseURL } from './components/action';
import './App.css';
import TopNavBar from './components/TopNavBar';
import SideNavBar from './components/sideNavBar';
import Footer from './components/footer';
import DashBoard from './components/dashBoard';
import Media from './components/media';
import Login from './components/Login';
import Registration from './components/Registration';
import ChangePassword from './components/changePassword';
import ForgotPassword from './components/forgotPassword';
import MyProfile from './components/myProfile';
import PageNotFound from './components/pageNotFound';

class App extends Component {
  render() {
    if (
      localStorage.getItem('token') !== undefined &&
      localStorage.getItem('token') !== '' &&
      localStorage.getItem('token') !== null
    ) {
      var token = localStorage.getItem('token');
    }

    const defaultparams = { params: { p1: '', p2: '' } };

    return (
      <BrowserRouter basename={baseURL}>
        <div>
          {token ? <TopNavBar /> : ''}
          {token ? <SideNavBar /> : ''}
          <div className="page_content">
            <Switch>
              <Route
                path="/"
                exact
                render={() => {
                  return token ? (
                    <DashBoard />
                  ) : (
                    <Login match={defaultparams} />
                  );
                }}
              />
              <Route
                path="/dashboard"
                render={() => {
                  return token ? <DashBoard /> : <Redirect to="/login" />;
                }}
              />
              <Route
                path="/media"
                render={() => {
                  return token ? <Media /> : <Redirect to="/login" />;
                }}
              />
              <Route path="/login/:p1?/:p2?" component={Login} />
              <Route
                path="/signup"
                render={() => {
                  return token ? (
                    <Redirect to="/dashboard" />
                  ) : (
                    <Registration />
                  );
                }}
              />
              <Route
                path="/forgotpassword"
                render={() => {
                  return token ? (
                    <Redirect to="/dashboard" />
                  ) : (
                    <ForgotPassword />
                  );
                }}
              />
              <Route
                path="/changepassword"
                render={() => {
                  return token ? <ChangePassword /> : <Redirect to="/login" />;
                }}
              />
              <Route
                path="/myprofile"
                render={() => {
                  return token ? <MyProfile /> : <Redirect to="/login" />;
                }}
              />
              <Route path="" component={PageNotFound} />
            </Switch>
          </div>
          <Footer />
        </div>
      </BrowserRouter>
    );
  }
}

export default App;

您需要检查令牌。如果存在则加载组件,否则重定向用户。

【讨论】:

  • 所以不需要制作一个组件来处理我们可以在浏览器路由器的根 app.js 页面上完成的逻辑吗?
  • 你能解释一下吗? 我对匹配的目的和默认参数感到困惑
猜你喜欢
  • 1970-01-01
  • 2019-06-26
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2023-03-21
相关资源
最近更新 更多