【发布时间】:2016-08-28 21:20:48
【问题描述】:
我最近将 Reflux 从 v0.3.0 升级到 v0.4.1
当我在更新后第一次测试我的代码时,我必须做的唯一更改是在我的组件的 Reflux.connect 调用中添加一个键。
但是,我遇到了一些奇怪的行为:
var SomeActions = Reflux.createActions([
'updateName'
]);
var SomeStore = Reflux.createStore({
listenables: [SomeActions],
init () {
this.name = '';
this.time = new Date();
},
getInitialState () {
return {
time: this.time
}
},
onUpdateName (newName) {
this.name = newName;
this.trigger({
name: this.name
});
}
});
var SomeComponent = React.createClass({
mixins: [React.connect(SomeStore, 'someState')],
componentDidMount () {
SomeActions.updateName(this.props.name);
},
render () {
console.log(this.state.someState);
...
}
});
当组件第一次挂载时,状态是正确的,只包含time。但是,在触发操作后,状态现在不正确,仅包含 name。升级前的行为是 trigger 简单地将新密钥添加/更新到状态中。因此,在动作触发后,我预计状态会同时包含 time 和 name。
我在更新期间错过了什么吗?
【问题讨论】:
-
你试过
this.trigger({ name: this.name, time: this.time });吗?很可能您的状态正在被清除时间的触发状态所取代。 -
是的,这行得通,但是在具有多个复杂商店的复杂应用程序中,我不希望每个操作都强制触发每个可能的状态键。我可以通过围绕一个触发器创建一个包装函数来克服这个问题,该触发器的其余部分可以使用,但这仍然需要该触发器强制每个可能的状态键。我想避免这种情况。
-
好的,那么 setState 发生在哪里?