react-router-redux在几秒钟后重新触发LOCATION_CHANGE

时间:2017-08-22 21:39:19

标签: javascript reactjs react-router-redux

在谷歌搜索并挖掘我的代码几个小时后,我才意识到我需要帮助。无法解释自己这里发生了什么,但我会尽力做到最清楚。

算法:

我创建了一个按钮组件,它向服务器发出POST请求,当承诺完成后,路由器推送新路由,清除当前组件的旧状态(onLeave挂钩)和在新路线上安装新组件。安装组件(componentDidMount)后,它会触发GET请求以获取以前保存的数据。

问题:

它工作正常,新路由被推送,状态被设置并且组件安装没有任何错误日志或状态不一致 ... 5秒(或多或少)以后,路由器重新-trigger本身为@@router/LOCATION_CHANGE并返回上一条路线。

我不知道为什么会这样。我首先想到的是,无论出于何种原因,我正在操纵前一条路线中的下一个组件的状态,但是没有。

另一种可能性是在路由离开钩子上触发的CLEAN_ON_LEAVE动作但对我没有意义,我只是触发一个完全隔离的组件的减速器。

谷歌没有给我很多关于这个问题的信息,所以我在这里。

代码:

发出POST请求并推送路由的操作:

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});
      });
  }
}

在新组件装载生命周期中发出GET请求的操作:

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});
      })
  }
}

该组件/操作的Reducer:

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触发器:

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} />

leaveCleaner:

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: The state progression with redux dev tools

第二个位置更改差异状态 second location change diff state

任何想法都将受到赞赏。

0 个答案:

没有答案