Redux 的异步Action中,如何回调页面中的交互

如题:
这样一个交互,在一个表单异步提交成功完后,希望清空页面上的表单控件;
1.表单信息都是存在store postDraft中,初始化进入时反向渲染,页面如下:

constructor(props) {
    super(props);
    this.state = {
      start: '',
      end: '',
      title: '',
      content: '',
    };
    this.submit = this.submit.bind(this);
    this.handleChange = this.handleChange.bind(this);
}
...
componentWillMount() {
    const { postInfo: { postDraft } } = this.props;
    this.setState(postDraft);
}
  1. 表单提交成功后清空,action 代码如下:
export function submitMeeting(meetingInfo) {
  return (dispatch, getState) => {
    if (shouldPost(getState().meeting)) {
      return console.log('已经在申请会议中');
    }
    dispatch(startPost());

    return new Promise((rev) => {    //模拟ajax
      setTimeout(() => {
        rev();
      }, 1500);
    }).then(() => {
      dispatch(endPost());
      dispatch(addMeeting(meetingInfo));
      dispatch(clearMeeting());    //清空store中的postDraft字段
    }, () => {
      dispatch(endPost());
    });
  };
}

现在遇到的问题是,在提交成功后stroe里面的 postDraft 字段已经被清空,但是前端页面表单里面还是有数据的。
分析是因为页面本地的state没有和store中的数据反向同步,对于这个问题一直没有特别好的方案:

  1. action中的没有直接调前端页面的清空函数,如 submitMeeting(meeting, clearCallback ); 这个clearCallback调用前端页面的清空函数;
  2. 在页面componentWillReceiveProps中检测store中的数据变化,一旦postDraft字段清空了,就调用前端页面的clearCallback;但是这个方案出发不稳定,会在表单为空的时候也会触发;

请问对于这个问题,麻友们一般是怎么处理;
感谢

阅读 4.7k
2 个回答

其实只要判断postDraft是否处于从不为空到为空的转变期间就好了。

也就是说,要在componentWillReceiveProps中,判断this.props.postDraft不为空,且nextProps.postDraft为空。则执行清空函数。

react + redux 并非是通过回调组件中的函数来实现更新的。

如果是使用的原生 redux,那么需要在组件中订阅 store,也就是 store.describe 方法,一般是在 DidMount 或者 DidUpdate 中注册。这个函数中就包含了一个回调函数,用于组件在 store 中数据更新后进行响应式的处理。不知道你的代码是不是缺了这一环节。

然后,一般在 react 中使用 redux 的技术栈会使用 react-redux 模块。如果使用这个模块,就不需要任何回调函数,store 中的所有数据更新都能通过 props 响应到组件上。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题