【问题标题】:React Router Dom v4 handle browser back buttonReact Router Dom v4 处理浏览器后退按钮
【发布时间】:2018-12-25 03:16:54
【问题描述】:

如何使用react-router-dom v4 禁用用户点击浏览器后退按钮?

我在页面上显示一个模式,当用户按下浏览器后退按钮时,用户会被带到上一个屏幕,而不是我想简单地关闭模式。

我试过这样做

onBackButtonEvent(event) {
    event.preventDefault();  
    // the user shouldn't be able to move backward or forward  
}
componentDidMount() {
    window.onpopstate = this.onBackButtonEvent;
}

但这并不能阻止用户后退或前进。有没有办法通过react-router-dom 处理这个问题?

我尝试了多种解决方案,但似乎没有任何效果。

【问题讨论】:

  • 您无法将您的模式融入新路线,例如/myroute/edit,当用户点击后退按钮时,他会被带到/myroute 并且模式会自动关闭?
  • 但这正是我想要避免的,我不想创建新路线。我的意思是,模态不应该有不同的路线,对吧?
  • 我不明白为什么不这样做。
  • 好的。我会试试的。

标签: javascript reactjs ecmascript-6 react-router-dom


【解决方案1】:

我知道这个问题有点老了,但我在自己寻找答案时偶然发现了它。没有干净的方法可以“禁用”后退按钮,而是让用户仅在单击浏览器后退按钮时关闭模式,我发现这可以工作。

只需将历史记录传递给 props 中的模态组件,然后在 componentWillUnmount 函数上调用以下代码。

componentWillUnmount() {
    this.props.history.goForward();
}

这将无缝地强制浏览器停留在同一页面上但关闭模式(假设它是一个类组件)。

更新:如果使用功能组件,上面的 componentWillUnmount 函数看起来像下面的钩子。

React.useEffect(() => {
    return () => {
            props.history.goForward();
        }
    }, []);

【讨论】:

  • 非常好。非常适合我想要的模式。
【解决方案2】:

您可以为您的模态创建一个新的Route,并将其保留在您的Switch 之外。这样,常规导航仍然适用,您还可以在 Switch 中呈现的内容之上呈现模式。

示例

function Home() {
  return <div> Home </div>;
}

function MyRoute() {
  return (
    <div>
      <h1>MyRoute</h1>
      <Link to="/myroute/edit"> Edit </Link>
      <Route
        path="/myroute/edit"
        render={({ history }) => (
          <ModalComponent history={history}>
            Welcome to the MyRoute edit screen
          </ModalComponent>
        )}
      />
    </div>
  );
}

class ModalComponent extends React.Component {
  onClick = e => {
    e.preventDefault();
    this.props.history.goBack();
  };

  render() {
    return (
      <Modal isOpen>
        <h1> {this.props.children} </h1>
        <Link to="/myroute" onClick={this.onClick}>
          Back
        </Link>
      </Modal>
    );
  }
}

function App() {
  return (
    <BrowserRouter>
      <div>
        <Link to="/"> Home </Link>
        <Link to="/myroute"> My Route </Link>
        <Switch>
          <Route exact path="/" component={Home} />
          <Route path="/myroute" component={MyRoute} />
        </Switch>
      </div>
    </BrowserRouter>
  );
}

const rootElement = document.getElementById("root");
Modal.setAppElement(rootElement);
ReactDOM.render(<App />, rootElement);

【讨论】:

  • 我实现了这个,当我按下按钮时,它给了我错误说 TypeError: Cannot read property 'props' of undefined
猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 2016-06-09
  • 1970-01-01
  • 2013-01-10
  • 2023-02-23
  • 2018-06-02
  • 1970-01-01
  • 2020-05-05
相关资源
最近更新 更多