【问题标题】:React route - logout cannot redirect to correct page反应路线-注销无法重定向到正确的页面
【发布时间】:2021-01-31 00:31:27
【问题描述】:

当我点击侧边菜单中的注销时,
它应该返回到 /login,但仍保持在同一路径 /home 中,内容消失。

App.js 中几个状态的解释

import React, { Component } from "react";
import { BrowserRouter, Switch, Route } from "react-router-dom";
import { Redirect } from "react-router";

import Login from "./Login";
import Drawer from "./Drawer";

console.warn = console.error = () => {};

class App extends Component {
  state = {
    isAuthenticated: false,
    isAuthenticating: true,
    user: null
  };

  setAuthStatus = (authenticated) => {
    this.setState({ isAuthenticated: authenticated });
  };

  setUser = (user) => {
    this.setState({ user: user });
  };

  handleLogout = async () => {
    try {
      //Sign Out api runs here
      this.setAuthStatus(false);
      this.setUser(null);
    } catch (error) {
      console.log(error);
    }
  };

  async componentDidMount() {
    try {
      // run api change to auth setAuthStatus
      // if api no return error > continue
      this.setAuthStatus(true);
      let user = { id: 123 };
      this.setUser(user);
    } catch (error) {
      console.log(error);
    }
    this.setState({ isAuthenticating: false });
  }

  render() {
    const authProps = {
      isAuthenticated: this.state.isAuthenticated,
      user: this.state.user,
      setAuthStatus: this.setAuthStatus,
      setUser: this.setUser
    };
    return (
      !this.state.isAuthenticating && (
        <React.Fragment>
          {this.state.isAuthenticated ? (
            <Drawer
              props={this.props}
              auth={authProps}
              handleLogout={this.handleLogout}
            />
          ) : (
            <BrowserRouter>
              <Switch>
                <Redirect exact from="/" to="/Login" />
                <Route
                  path="/login"
                  render={(props) => <Login {...props} auth={authProps} />}
                />
              </Switch>
            </BrowserRouter>
          )}
        </React.Fragment>
      )
    );
  }
}

export default App;

isAuthenticating:
componentDidMount会调用api查看会话是否继续,
如果是,isAuthenticating 等于 true,可以防止在刷新页面或转到其他路由时丢失当前会话中的用户身份验证。

已通过身份验证:
如果 !isAuthenticated > 必须留在/重定向到登录页面

沙盒:
https://codesandbox.io/s/restless-breeze-p5uih?file=/src/App.js

【问题讨论】:

  • 请在您的问题中添加相关代码

标签: reactjs react-router


【解决方案1】:

我在沙盒中按预期工作。如果用户使用

注销,则隐藏抽屉和主要内容
this.state.isAuthenticated ? (Drawer) : <Login/>

您应该将抽屉与主要内容分开并将路由器合并在一起。一般来说,您应该只为应用程序使用一个路由器。同时删除重定向:

 <React.Fragment>
          {this.state.isAuthenticated ? (
            <Drawer
              props={this.props}
              auth={authProps}
              handleLogout={this.handleLogout}
            />
          ) : (
            <BrowserRouter>
            <main
          className={clsx(classes.content, {
            [classes.contentShift]: open
          })}
        >
              <Switch>
              {Routes.map((route) => {
              return (
                <Route
                  path={route.path}
                  render={(prop) => (
                    <route.component {...prop} auth={props.auth} />
                  )}
                />
              );
            })}
                <Route
                  path="/login"
                  render={(props) => <Login {...props} auth={authProps} />}
                />
              </Switch>
              </main>
            </BrowserRouter>
          )}
        </React.Fragment>

要路由到注销,首先将浏览器路由器向上移动到 index to wrap 。 这将让您使用 withRouter HigherOrderComponent: export default withRouter(App) 现在您可以从道具访问历史记录并转到登录:

    this.props.history.push("/login")`

【讨论】:

  • 如果我这样做并删除 Drawer.js 中的路由器。它无法按预期工作
  • 我第一次的工作流程:npm start > 先到/login > 点击注销会回到/login
  • 你的代码中
    有什么用?我是否需要删除Drawer.js中关于Router的代码?
  • 另外,关于你删除的建议,我使用它是因为我想第一时间浏览/login
  • 我刚刚从您的代码中复制了 main,因为那是您在路线中呈现的内容。为什么不触发挂载重定向?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2019-05-28
相关资源
最近更新 更多