这是解决问题的方法。该解决方案假定InputFormComponent 和ActionComponent 在一些ParentComponent 内,或者可以很容易地封装在一个内。
ParentComponent 被 connect 包裹,并且可以访问 redux 存储。 Parent 在抽象级别上的渲染看起来像这样(可能有任何级别的兄弟姐妹或嵌套):
//Parent Component
render() {
return (
<InputFormComponent
data={this.{state|prop}.initialData}
userClickedSave={this.state.userClickedSave}
clickSavedAcknowledged={this.clickedSavedAcknowledged}
/>
<ActionComponent
onSaveClicked={this.onSaveClicked}
/>
)
}
从上面的代码我们可以了解到ParentComponent 在其state 上有一个userClickedSave 标志。它有一个名为onSaveClicked 的方法,当从ActionComponent 调用该方法时,会将this.state.userClickedSave 更新为true。
现在让我们看看InputFormComponent 在其componentWillReceiveProps 上对userClickedSave 的表现如何:
//Input form component
componentWillReceiveProps(nextProps) {
if (nextProps.userClickedSave && this.props.userClickedSave !== nextProps.userClickedSave) {
nextProps.clickSavedAcknowledged(this.state.inputValue)
}
}
InputFormComponent 将监听 userClickedSave 的变化,对于正确的场景,它将使用当前输入值调用 clickSavedAcknowledged,ParentComponent 现在可以将其保存到 redux 存储:
//Parent component
clickSavedAcknowledged(inputValue) {
this.props.saveInputValue(inputValue)
this.setState({
userClickedSave: false
})
}
onSaveClicked() {
this.setState({
userClickedSave: true
})
}
如您所见,Parent 将数据保存到 redux 存储并将userClickedSave 重置回false,因此当用户单击保存按钮时,该过程可以重复。