如何知道react-router是否可以返回到在反应应用程序中显示后退按钮

phi*_*ilk 11 html5-history reactjs react-router

似乎没有API方法来检测您是否可以从应用程序中的当前页面返回.可以检查历史长度,但包括前向和后向堆栈.

我只想在用户实际可以返回时显示后退按钮.

Tug*_*dız 23

您可以检查location.key您是否有位置键,这意味着您在应用程序内进行了路由。但如果您不这样做,则意味着您来自应用程序外部,或者您只是在新选项卡中打开应用程序等。

import { useHistory, useLocation } from "react-router-dom";
const history = useHistory();
const location = useLocation();

<Button
  onClick={() => {
    if (location.key) {
      history.goBack();
    }
  }}
  disabled={!location.key}
/>;
Run Code Online (Sandbox Code Playgroud)

对于 V6 及更新版本:

import { useHistory, useLocation } from "react-router-dom";
const history = useHistory();
const location = useLocation();

<Button
  onClick={() => {
    if (location.key !== 'default') {
      history.goBack();
    }
  }}
  disabled={location.key === 'default'}
/>;
Run Code Online (Sandbox Code Playgroud)

  • 警告:使用最新版本的 React Router V6,您必须检查“default”而不是空字符串。现在您的初始位置是“默认”而不是“”。阅读 API 参考:https://github.com/remix-run/history/blob/main/docs/api-reference.md#location (3认同)
  • +1,这对我有用,尽管我希望我可以把手放在一些文档上,这些文档清楚地表明新打开的选项卡将始终具有 NULL 键。 (2认同)

Has*_*war 9

您可以通过检查history.action其值是否为 来实现POP,然后就没有返回的路径。这是我找到的唯一方法。

<Button
  onClick={() => {
    if (history.action !== 'POP') history.goBack();
  }}
  disabled={history.action === 'POP'}
/>
Run Code Online (Sandbox Code Playgroud)

  • action 属性指定路由器的最后一个操作,它与历史堆栈中的剩余项目没有任何关系。 (5认同)

Moh*_*rma -4

它给出“POP”和“PUSH”值using this.props.location.action