似乎没有 API 方法可以检测您是否可以从应用程序的当前页面返回。可以检查历史长度,但这包括向前和向后堆栈。
我只想在用户实际可以返回时才显示后退按钮。
似乎没有 API 方法可以检测您是否可以从应用程序的当前页面返回。可以检查历史长度,但这包括向前和向后堆栈。
我只想在用户实际可以返回时才显示后退按钮。
您可以通过检查history.action
其值是否为 来实现POP
,则没有返回的路径。这是我找到的唯一方法。
<Button
onClick={() => {
if (history.action !== 'POP') history.goBack();
}}
disabled={history.action === 'POP'}
/>
我想我找到了解决方法
调用 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