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

Posted

技术标签:

【中文标题】如何使用反应路由器获取以前的位置?【英文标题】:How to get previous location with react router? 【发布时间】:2018-10-03 13:36:21 【问题描述】:

我正在尝试从反应路由器获取以前的位置。我已经设置了一个减速器来监听@@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】:

最好像这样直接从react-router-redux导入动作类型:

import  LOCATION_CHANGE  from 'react-router-redux'

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

所以,你的 reducer 应该是这样的:

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
    

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

这与react-router-redux 的内部实现有关。在库的底层,在初始渲染期间,history 对象的 getCurrentLocation 被调用,这在历史版本 v4.0.0-2 中已被删除。

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

【讨论】:

谢谢!订阅历史更改对我有用。 "这个项目不再维护。为了你的 Redux 路由器同步需求与 React Router 4+"

以上是关于如何使用反应路由器获取以前的位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应原生应用程序中使用 Geolocation 获取设备的当前位置

使用反应路由器 v6 的反应嵌入式登录实现

如何调试反应路由器未在 url 更改时加载组件

如何在反应路由器dom v4中获取组件中的参数?

使用带反应路由器的锚点

如何在反应中使用redux取消以前的axios