如何使用反应路由器获取以前的位置?

时间:2018-04-23 13:21:41

标签: reactjs react-redux react-router-v4 react-router-dom

我正在尝试从反应路由器获取以前的位置。我已经设置了一个减速器来监听@@ router / LOCATION_CHANGE并存储当前和新的位置,但这个动作似乎不再被解雇了?

Reducer看起来像这样:

const initialState = {
previousLocation: null,
currentLocation: null,
};
const routerLocations = function (state = initialState, action) {
  const newstate = { ...state };
  switch (action.type) {
      case "@@router/LOCATION_CHANGE":
          newState.previousLocation = state.currentLocation;
          newState.currentLocation = action.payload;
          return newState
    default:
      return state;
  }
}

export default routerLocations;

@@ router / LOCATION_CHANGE正确听吗?

我正在使用

"react-router": "^4.2.0",
"react-router-dom": "^4.2.2",
"react-router-redux": "^4.0.8",

1 个答案:

答案 0 :(得分:2)

最好直接从react-router-redux导入操作类型:

import { LOCATION_CHANGE } from 'react-router-redux'

然后在你的减速机中使用它。更改history后,此操作将返回新对象。可能只需要pathname属性。

所以,你的减速器应该是这样的:

import { LOCATION_CHANGE } from 'react-router-redux'

const initialState = {
    previousLocation: null,
    currentLocation: null,
}

export default (state = initialState, action) => {
    switch (action.type) {
        case LOCATION_CHANGE:
            return {
                previousLocation: state.currentLocation,
                currentLocation: action.payload.pathname,
            }
        default:
            return state
    }
}

我遇到的问题是这个动作在初始渲染时不会触发。我已经调查并意识到它只能在早于版本v4.0.0-2 的history 时使用。

这与react-router-redux的内部实施有关。在库的引擎盖下,在调用getCurrentLocation对象的初始渲染history期间,在历史版本v4.0.0-2中删除了该对象。

这就是为什么您应该降级history版本或尝试订阅history更改并在初始渲染时自行发送操作。