如题:
这样一个交互,在一个表单异步提交成功完后,希望清空页面上的表单控件;
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);
}
- 表单提交成功后清空,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中的数据反向同步,对于这个问题一直没有特别好的方案:
- action中的没有直接调前端页面的清空函数,如 submitMeeting(meeting, clearCallback ); 这个clearCallback调用前端页面的清空函数;
- 在页面componentWillReceiveProps中检测store中的数据变化,一旦postDraft字段清空了,就调用前端页面的clearCallback;但是这个方案出发不稳定,会在表单为空的时候也会触发;
请问对于这个问题,麻友们一般是怎么处理;
感谢
其实只要判断postDraft是否处于从不为空到为空的转变期间就好了。
也就是说,要在componentWillReceiveProps中,判断this.props.postDraft不为空,且nextProps.postDraft为空。则执行清空函数。