如何使用react-router-dom在react中创建受保护的路由

学习者62

如何使用react-router-dom创建受保护的路由并将响应存储在本地存储中,以便用户下次尝试打开时可以再次查看其详细信息。登录后,他们应重定向到仪表板页面。

所有功能都添加在ContextApi中。Codesandbox链接:代码

我尝试过但无法实现

路线页

import React, { useContext } from "react";
import { globalC } from "./context";
import { Route, Switch, BrowserRouter } from "react-router-dom";
import About from "./About";
import Dashboard from "./Dashboard";
import Login from "./Login";
import PageNotFound from "./PageNotFound";

function Routes() {
  const { authLogin } = useContext(globalC);
  console.log("authLogin", authLogin);

  return (
    <BrowserRouter>
      <Switch>
        {authLogin ? (
          <>
            <Route path="/dashboard" component={Dashboard} exact />
            <Route exact path="/About" component={About} />
          </>
        ) : (
          <Route path="/" component={Login} exact />
        )}

        <Route component={PageNotFound} />
      </Switch>
    </BrowserRouter>
  );
}
export default Routes;

上下文页面

import React, { Component, createContext } from "react";
import axios from "axios";

export const globalC = createContext();

export class Gprov extends Component {
  state = {
    authLogin: null,
    authLoginerror: null
  };
  componentDidMount() {
    var localData = JSON.parse(localStorage.getItem("loginDetail"));
    if (localData) {
      this.setState({
        authLogin: localData
      });
    }
  }

  loginData = async () => {
    let payload = {
      token: "ctz43XoULrgv_0p1pvq7tA",
      data: {
        name: "nameFirst",
        email: "internetEmail",
        phone: "phoneHome",
        _repeat: 300
      }
    };
    await axios
      .post(`https://app.fakejson.com/q`, payload)
      .then((res) => {
        if (res.status === 200) {
          this.setState({
            authLogin: res.data
          });
          localStorage.setItem("loginDetail", JSON.stringify(res.data));
        }
      })
      .catch((err) =>
        this.setState({
          authLoginerror: err
        })
      );
  };
  render() {
    // console.log(localStorage.getItem("loginDetail"));
    return (
      <globalC.Provider
        value={{
          ...this.state,
          loginData: this.loginData
        }}
      >
        {this.props.children}
      </globalC.Provider>
    );
  }
}

德鲁·里斯(Drew Reese)

问题

<BrowserRouter>
  <Switch>
    {authLogin ? (
      <>
        <Route path="/dashboard" component={Dashboard} exact />
        <Route exact path="/About" component={About} />
      </>
    ) : (
      <Route path="/" component={Login} exact />
    )}

    <Route component={PageNotFound} />
  </Switch>
</BrowserRouter>

Switch不处理渲染以外的任何RouteRender组件。如果要像这样“嵌套”,则需要将它们包装在通用路由中,但这完全没有必要。

您的登录组件也不处理重定向回原始访问的任何“主页”页面或专用路由。

解决方案

创建一个使用PrivateRoute您的身份验证上下文组件。

const PrivateRoute = (props) => {
  const location = useLocation();
  const { authLogin } = useContext(globalC);
  console.log("authLogin", authLogin);

  return authLogin ? (
    <Route {...props} />
  ) : (
    <Redirect
      to={{
        pathname: "/login",
        state: { from: location }
      }}
    />
  );
};

更新您的Login组件以处理重定向回正在访问的原始路由。

export default function Login() {
  const location = useLocation();
  const history = useHistory();
  const { authLogin, loginData } = useContext(globalC);

  if (authLogin) {
    const { from } = location.state || { from: { pathname: "/" } };
    history.replace(from)
  }

  return (
    <div
      style={{ height: "100vh" }}
      className="d-flex justify-content-center align-items-center"
    >
      <button type="button" onClick={loginData} className="btn btn-primary">
        Login
      </button>
    </div>
  );
}

在“固定列表”中呈现所有路线

function Routes() {
  return (
    <BrowserRouter>
      <Switch>
        <PrivateRoute path="/dashboard" component={Dashboard} />
        <PrivateRoute path="/About" component={About} />
        <Route path="/login" component={Login} />
        <Route component={PageNotFound} />
      </Switch>
    </BrowserRouter>
  );
}

使用反应路由器域编辑如何在反应中创建受保护的路由

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用 react-router-dom 创建动态路由?

来自分类Dev

使用React Router V6实施受保护的路由

来自分类Dev

React Router Dom 受保护的路由在刷新页面期间始终重定向到登录

来自分类Dev

如何创建动态路由,以基于react-router-dom中组件的属性命名路由

来自分类Dev

带异步的React-router-dom保护的路由

来自分类Dev

如何使用 TypeScript 和 React-Router 4、5 或 6 重写受保护/私有路由?

来自分类Dev

React Router JWT保护路由

来自分类Dev

如何使用React-Router

来自分类Dev

使用React-Router-Dom创建PrivateRoute

来自分类Dev

如何在React中使用React Router检测路由变化?

来自分类Dev

如何在React中使用React Router检测路由变化?

来自分类Dev

当使用路由渲染道具而不是路由组件道具时,如何访问 react-router-dom 4 中的 url args?

来自分类Dev

如何使用React正确设置react-router-dom链接

来自分类Dev

使用React Router,如何使用路由配置传递组件道具?

来自分类Dev

React Router Dom嵌套路由,或者如何传递

来自分类Dev

无法使用 switch 语句渲染路由 React router dom 5.0.0

来自分类Dev

如何使用React Router的重定向功能?

来自分类Dev

如何在Electron中使用React Router?

来自分类Dev

如何正确使用React-Router

来自分类Dev

如何在React Router中使用HistoryLocation?

来自分类Dev

如何在Preact中使用React Router

来自分类Dev

如何使用react-router-redux routeActions?

来自分类Dev

如何正确使用React-Router

来自分类Dev

如何使用React Router处理登录状态?

来自分类Dev

如何在React Redux中添加受保护的路由

来自分类Dev

使用react-router-dom时如何通过路由传递forwardRef

来自分类Dev

如何使用react-router-dom添加将渲染组件的路由?

来自分类Dev

如何使用React-Router防止路由更改

来自分类Dev

React-Router-如何在onEnter中使用路由参数?

Related 相关文章

  1. 1

    如何使用 react-router-dom 创建动态路由?

  2. 2

    使用React Router V6实施受保护的路由

  3. 3

    React Router Dom 受保护的路由在刷新页面期间始终重定向到登录

  4. 4

    如何创建动态路由,以基于react-router-dom中组件的属性命名路由

  5. 5

    带异步的React-router-dom保护的路由

  6. 6

    如何使用 TypeScript 和 React-Router 4、5 或 6 重写受保护/私有路由?

  7. 7

    React Router JWT保护路由

  8. 8

    如何使用React-Router

  9. 9

    使用React-Router-Dom创建PrivateRoute

  10. 10

    如何在React中使用React Router检测路由变化?

  11. 11

    如何在React中使用React Router检测路由变化?

  12. 12

    当使用路由渲染道具而不是路由组件道具时,如何访问 react-router-dom 4 中的 url args?

  13. 13

    如何使用React正确设置react-router-dom链接

  14. 14

    使用React Router,如何使用路由配置传递组件道具?

  15. 15

    React Router Dom嵌套路由,或者如何传递

  16. 16

    无法使用 switch 语句渲染路由 React router dom 5.0.0

  17. 17

    如何使用React Router的重定向功能?

  18. 18

    如何在Electron中使用React Router?

  19. 19

    如何正确使用React-Router

  20. 20

    如何在React Router中使用HistoryLocation?

  21. 21

    如何在Preact中使用React Router

  22. 22

    如何使用react-router-redux routeActions?

  23. 23

    如何正确使用React-Router

  24. 24

    如何使用React Router处理登录状态?

  25. 25

    如何在React Redux中添加受保护的路由

  26. 26

    使用react-router-dom时如何通过路由传递forwardRef

  27. 27

    如何使用react-router-dom添加将渲染组件的路由?

  28. 28

    如何使用React-Router防止路由更改

  29. 29

    React-Router-如何在onEnter中使用路由参数?

热门标签

归档