我刚刚开始使用flummox
,我有点困惑:)
这是我的用例。
应用布局
<section id="layout">
<Header {...this.props} />
<RouteHandler {...this.props} />
<Footer />
<Alert {...this.props} />
</section>
在我的应用程序中,我有Alert Component
. 当发生某些事情时,我AlertAction
从某个组件触发一个,它会将警报有效负载分派到AlertStore
,它会被更新,并AlertComponent
显示警报( + 在一段时间后隐藏它)。
例如我有一个PostEdit Component
. 表单提交后,我向 API 发送请求PostActions
并接收响应,该响应被分派到PostStore
. 商店得到更新并PostEdit Component
得到通知。在PostEdit
'scomponentWillReceiveProps
我检查道具,从商店收到,并触发AlertAction
显示警报。
2个问题:
- 我必须使用
setTimeout
触发AlertAction
来Post Component
使警报发生(下面的代码)。 - 主要问题是在第一次转换后
Alert Component
停止收听。AlertStore
react-router
这是console.log,说明了问题:
更奇怪的是,console.log 中的 changed-store-notification 在 dispatch-payload-from-action-notification 之前打印(这会导致此存储更改)。
以下是代码片段:
警报处理程序.jsx
export default class AlertHandler extends React.Component {
// constructor()
render() {
return (
<FluxComponent connectToStores={'alerts'}>
<Alert {...this.props} />
</FluxComponent>
);
}
}
警报.jsx
export default class Alert extends React.Component {
// constructor()
// _handleShow()
// _handleHide()
componentDidMount() {
this.props.flux.getStore('alerts').addListener('change', function() {
console.log('Changed!', this.state);
});
}
componentWillUnmount() {
console.log('Not gonna happen');
}
// render()
}
PostEdit.jsx
export default class PostEdit extends React.Component {
// constructor()
componentWillReceiveProps(newProps) {
this.setState({
isLoading: false
}, () => {
if (newProps.errors) {
// without `setTimeout` nothing happens
setTimeout(() => {
newProps.flux
.getActions('alerts')
.showErrorAlert(newProps.errors);
}, 1);
} else {
setTimeout(() => {
newProps.flux
.getActions('alerts')
.showSuccessAlert();
}, 1);
}
});
}
_submitPost(e) {
// doing stuff...
// triggering updatePost action
this.props.flux
.getActions('posts')
.updatePost(post);
}
// render()
}
不确定是这些错误还是我错过了通量/flummox 模式中的某些东西并且做错了事情。感谢您的反馈!