javascript - 在react-router-dom中如何像react-navigation一样获得 `previous`?

标签 javascript reactjs react-router react-navigation react-router-dom

我正在使用react-navigation 5 和 react-router-dom ,

我们使用previous来定义是否应该定义后退按钮。我们希望在 react-router 中有等价的东西。

function App() {
    const { previous, goBack, toggleDrawer } = useNavigation();
    return (
      <div>
        {previous ? (
          <Button
            onPress={goBack}
          />
        ) : (
          <Button
            icon="menu"
            onPress={toggleDrawer}
            accessibilityLabel="toggle drawer menu"
          />
        )}
      </div>
    );
}

如何在 react-router-dom 中获得 previous ,如 react-navigation 中那样? (如 const { previous } = useNavigation();

最佳答案

我创建了一个历史记录缩减器来跟踪最后 N 个历史记录条目。此实现是一个“堆栈”,“顶部”始终位于索引 0,“顶部”是当前位置,即您刚刚推送的路线,因此索引 1 将是之前的位置。

import { LOCATION_CHANGE } from 'connected-react-router';

const HISTORY_LENGTH = 10;

const initialState = [];

const locationReducer = (state = initialState, action) => {
  const { type } = action;

  switch (type) {
    case LOCATION_CHANGE: {
      const { payload } = action;
      if (
        state.length &&
        state[0].location.pathname === payload.location.pathname
      ) {
        // if pushing same route, return old state
        return state;
      }

      switch (payload.action) {
        case 'REPLACE':
          // if replacing current entry, don't "push" on new route, replace "top"
          return [payload, ...state.slice(1)];

        // handle other action cases to maintain your stack

        default: // PUSH
          // ensure only last HISTORY_LENGTH entries kept
          return [payload, ...state].slice(0, HISTORY_LENGTH);
      }
    }

    default:
      return state;
  }
};

export default locationReducer;

LOCATION_CHANGEactionconnected-react-router 定义,当您的历史记录收到位置更改时调度。

每个有效负载具有以下形状:

{
  location,
  action,
  isFirstRendering,
}

如果您希望有选择地呈现“后退”按钮,那么您可以检查堆栈,如果有超过 1 个条目,您可以断言存在要返回的页面。

关于javascript - 在react-router-dom中如何像react-navigation一样获得 `previous`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59925175/

相关文章:

javascript - 使用 "choose file"输入更改 div backgroundImage

java - 带有特殊字符的速度模板变量名 - 一个点

javascript - 渲染嵌套对象

css - 调整窗口大小时如何在 React 中缩小表格中不断增长的图表

javascript - 将事件类动态添加到 REACT JS 中的多级侧边栏菜单

javascript - 如果时间超过一定时间,Node js 将暂停执行语句

javascript - 我应该在 Backbone.js 中避免这种情况吗?

javascript - 如果不满足条件,如何在不重复的情况下执行内部函数?

reactjs - 路线不会根据 React 测试中的历史记录而改变

javascript - 单击 React-router 中的链接时,组件获得错误的 props