在使用React Boilerplate并实现自定义DevTools(不是浏览器插件)之后,我注意到当您导航回来时,会触发多个LOCATION_CHANGE操作。这将为每个新的向后导航添加一个额外的条目,因此它从2开始,然后是4,然后是6,依此类推。好像正在评估整个browserHistory并为每个项目发出一个动作列出POP / PUSH / POP / PUSH /...
在实际的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。
感谢您的任何见解。试图确保我没有从根本上误解某些东西。