在谷歌搜索并挖掘我的代码几个小时后,我才意识到我需要帮助。无法解释自己这里发生了什么,但我会尽力做到最清楚。
我创建了一个按钮组件,它向服务器发出POST
请求,当承诺完成后,路由器推送新路由,清除当前组件的旧状态(onLeave
挂钩)和在新路线上安装新组件。安装组件(componentDidMount
)后,它会触发GET
请求以获取以前保存的数据。
它工作正常,新路由被推送,状态被设置并且组件安装没有任何错误日志或状态不一致 ... 5秒(或多或少)以后,路由器重新-trigger本身为@@router/LOCATION_CHANGE
并返回上一条路线。
我不知道为什么会这样。我首先想到的是,无论出于何种原因,我正在操纵前一条路线中的下一个组件的状态,但是没有。
另一种可能性是在路由离开钩子上触发的CLEAN_ON_LEAVE
动作但对我没有意义,我只是触发一个完全隔离的组件的减速器。
谷歌没有给我很多关于这个问题的信息,所以我在这里。
export const savePlan = (date, plan) => {
const postData = { plan_date: date, planification: plan };
return dispatch => {
post(`${API_URL}/save_plan`, postData)
.then(res => {
browserHistory.push(`/social-planning/plan/${res.data.id}`);
})
.catch(res => {
console.log('error');
console.log({res});
});
}
}
export const getPlan = (id) => {
return dispatch => {
get(`${API_URL}/plans/${id}`)
.then(res => {
const { plan_date, planification } = res.data;
dispatch(doDispatch(creators.set_planning_view_date, plan_date));
dispatch(doDispatch(creators.set_planning_view_planification, planification));
})
.catch(res => {
console.log({res});
})
}
}
const planningView = (state = initialState, action) => {
switch (action.type) {
case creators.set_planning_view_date:
return { ...state, plan_date: action.payload };
case creators.set_planning_view_planification:
return { ...state, planification: action.payload };
default:
return state;
}
}
componentDidMount() {
const { planId } = this.props.params;
const { getPlan } = this.props;
getPlan(planId);
}
<Route path='social-planning/planner' component={Planner} onEnter={isLoggedIn} onLeave={leaveCleaner} />
<Route path='social-planning/plan/:planId' component={PlanningView} onEnter={isLoggedIn} />
export const leaveCleaner = () => {
STORE.dispatch({ type: 'CLEAN_ON_LEAVE' });
}
case CLEAN_ON_LEAVE:
return {
...initialState,
cells: [...setCells()],
compare_posts: [],
post_prev_data: []
}
所以,有相关的代码(但如果你需要更多,我可以展示它)......无论如何,这里有一些额外的数据(图像):
使用redux dev工具和正确的新路由挂载的状态进程,然后重新触发location_change:
任何想法都将受到赞赏。