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

IT技术 reactjs react-router html5-history
2021-04-27 04:35:14

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

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

4个回答

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

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

我想我找到了解决方法

onpopstate 事件

调用 history.pushState() 或 history.replaceState() 不会触发 popstate 事件。当在同一文档的两个历史条目之间导航时,popstate 事件仅通过执行浏览器操作触发,例如单击后退按钮(或在 JavaScript 中调用 history.back())。

我检查了它:react-router在状态下保存一个关键属性:在历史记录中它可能包含如下数据: event.state: {key: "jr2go2", state: undefined}

当我们返回到我们进入站点或应用程序的最后一页时,此状态属性将为 null: event.state: null

所以我们可以像这样使用 redux + rxjs(例如)来处理它:

// epic
export const handleHistoryWalkEpic = () =>
  fromEvent<PopStateEvent>(window, 'popstate')
  .pipe(
    map(event => setCanGoBack(!!event.state)),
  )

// reducer
case NavigationBarActionsTypes.SET_CAN_GO_BACK:
  return {
    ...state,
    canGoBack: action.payload.canGoBack,
  }

并且您应该在任何推送历史记录操作上将 canGoBack 设置为 true,您的任何路由器处理程序组件都可以:

componentWillUpdate(nextProps: any) {
    let { location } = this.props;

    if (nextProps.history.action === 'PUSH') {
      this.props.setCanGoBack()
    }
}

您可以通过检查是否location.history> 2 来实现。

在您的应用中显示或不显示后退按钮的示例:

onBack={ history.length > 2 ? () => { history.goBack() } : null }

它给出了 'POP' 和 'PUSH' 值 using this.props.location.action