使用react redux router,immutablejs和devtools

时间:2016-08-29 20:08:39

标签: reactjs redux url-routing immutability

在使用React Boilerplate并实现自定义DevTools(不是浏览器插件)之后,我注意到当您导航回来时,会触发多个LOCATION_CHANGE操作。这将为每个新的向后导航添加一个额外的条目,因此它从2开始,然后是4,然后是6,依此类推。好像正在评估整个browserHistory并为每个项目发出一个动作列出POP / PUSH / POP / PUSH /...

location_change multiple fires

在实际的DevTools检查器窗口中,尽管每个操作有多个console.log行,但只有单个操作。如果我在DevTools中提交当前项目集,则计数重新开始... 2/4/6等。

使用DevTools时这是预期的副作用吗?我问,因为当我关闭DevTools功能时,每个导航都会输入一个条目。这是自定义routerReducer中路由变异状态的问题(通过state.merge实际变异,只是为了处理它)?

以下是代码的复习:

/** in app.js **************************/
const history = syncHistoryWithStore(browserHistory, store, {
  selectLocationState: selectLocationState(),
});


/** in selectors.js **************************/
const selectLocationState = () => {
  let prevRoutingState;
  let prevRoutingStateJS;

  return (state) => {
      const routingState = state.get('route'); // or state.route

      if (!routingState.equals(prevRoutingState)) {
          prevRoutingState = routingState;
          prevRoutingStateJS = routingState.toJS();
      }

      return prevRoutingStateJS;
  };
};

/** in reducers.js **************************/
function routeReducer(state = fromJS({
  locationBeforeTransitions: null,
}), action) {
  switch (action.type) {
    case LOCATION_CHANGE:
      console.log('location_change happened: ', action.payload)
      return state.merge({
        locationBeforeTransitions: action.payload,
      });
    default:
      return state;
  }
}

export default function createReducer(asyncReducers) {
  return combineReducers({
    route: routeReducer
  });
}

/** in store.js **************************/
if (DevTools) enhancers.push(DevTools.instrument());

我将此与我们当前不需要特殊位置状态管理的项目进行比较(没有redux-immutable或immutablejs),并且我们得到每个新位置状态的预期1个对数行,即使是实现DevTools。

感谢您的任何见解。试图确保我没有从根本上误解某些东西。

0 个答案:

没有答案