在react-router 2中禁用后退按钮

时间:2016-03-21 20:58:37

标签: javascript reactjs react-router

我正在使用react-router 2.我的路由被定义为

   <Route path="/" component={App}>
       <IndexRoute component={Home}/>
       <Route path="/about" component={About}/>
       <Route path="/login" component={Login} onEnter={redirectToDashboard}/>
       <Route path="/logout" component={Logout} onEnter={logoutSession}/>
       <Route path="/dashboard" component={Dashboard} onEnter={redirectToLogin}/>
   </Route>

一切正常但我无法从仪表板页面禁用后退按钮。

成功登录后,我将用户重定向到仪表板页面,但当用户点击后退按钮时,它再次进入登录页面。当用户在仪表板页面上时,我想禁用browser的后退按钮。

8 个答案:

答案 0 :(得分:11)

您最好的选择是,当用户登录时,他/她被重定向到dashbaord。如果由于某种原因用户单击后退按钮,您应该:

如果用户已登录  留在页面仪表板上

if(logged) {
  history.pushState(null, null, location.href);
  window.onpopstate = function(event) {
    history.go(1);
  };
}

将无法返回。

答案 1 :(得分:3)

无法禁用浏览器按钮。 我的建议是,如果他/她已被记录,则将用户重定向回仪表板页面

答案 2 :(得分:1)

实际上你无法禁用后退按钮。您可以通过阻止浏览器的“后退”操作来使用黑客攻击。只需在您的Dashboard组件compnentWillMount()生命周期方法中添加一些代码,这些代码将触发浏览器的“转发”操作:

componentWillMount() {
   setTimeout(() => {
     window.history.forward()
   }, 0)
   window.onunload=function(){null};
}

但最有可能更好的解决方案是根据用户登录状态进行一些重定向。

答案 3 :(得分:1)

应用所有这些技巧后,我看到url会稍微更改为“ login”,然后更改为“ where-we-push”。 相反,我们可以做的是->在api成功登录的情况下,执行:history.replace('/ Whatever_screen')。 这将从window.history堆栈中删除登录屏幕。

答案 4 :(得分:0)

在您要禁用后退的页面上(例如,在LoginApp上)添加此块,以禁用后退Web历史记录

componentDidMount() {
    window.history.pushState(null, document.title, window.location.href);
    window.addEventListener('popstate', function (event){
        window.history.pushState(null, document.title,  window.location.href);
    });
}

答案 5 :(得分:0)

在登录屏幕中,将替换添加到/ dashboard

"scripts": {
  "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server",
  "build": "nuxt build",
  "start": "cross-env NODE_ENV=production node server/index.js"
}

原因是将您当前的路径(/ login)替换为/ dashboard。在添加此内容之前,请确保正确设置身份验证。

答案 6 :(得分:0)

为了提高代码的可重用性,我们可以在index.html中添加一个事件侦听器,并从所有componentDidMount()方法中分配浏览器向后禁用事件。

index.html中,

window.addEventListener('navigationhandler', function (e) {
  window.history.pushState(null, document.title, window.location.href);
  window.addEventListener('popstate', function (event) {
    window.history.pushState(null, document.title, window.location.href);
  });
});

在React componentDidMount()方法中,

componentDidMount() {
   window.dispatchEvent(new CustomEvent("navigationhandler"));
}

答案 7 :(得分:0)

无法禁用浏览器按钮。但是我们可以使用 listen()go()push() 等历史方法来覆盖 react.js 中后退按钮的默认行为。也尝试使用 withRouter()

以下是执行此操作的示例代码。请查看 componentDidMount()componenetDidUnmount() 方法。

import React from "react";
import { Redirect, Switch, Route, withRouter } from "react-router";

import Page1 from "./Page1";
import Page2 from "./Page2";
import Page3 from "./Page3";

class App extends React.Component {
  constructor(props) {
    super(props);

    // Store the previous pathname and search strings
    this.currentPathname = null;
    this.currentSearch = null;
  }

  componentDidMount() {
    const { history } = this.props;

    history.listen((newLocation, action) => {
      if (action === "PUSH") {
        if (
          newLocation.pathname !== this.currentPathname ||
          newLocation.search !== this.currentSearch
        ) {
          this.currentPathname = newLocation.pathname;
          this.currentSearch = newLocation.search;

          history.push({
            pathname: newLocation.pathname,
            search: newLocation.search
          });
        }
      } else {
        history.go(1);
      }
    });
  }

  componentWillUnmount() {
    window.onpopstate = null;
  }

  render() {
    return (
      <Switch>
        <Route exact path="/" render={() => <Redirect to="/page1" />} />
        <Route path="/page1" component={Page1} />
        <Route path="/page2" component={Page2} />
        <Route path="/page3" component={Page3} />
      </Switch>
    );
  }
}

export default withRouter(App);

欲知更多:Disable react back button