访问从组件中的动作创建者返回的信息是否会破坏 Flux?
Does accessing information returned from an action creator in a component break Flux?
在组件中执行操作时是否会破坏 Flux 模式以访问组件内操作创建者返回的承诺?
动作创作者
class MyActionCreators extends Marty.ActionCreators {
create() {
this.dispatch(MyActionConstants.CREATE_ACTION);
return MyActionAPI.create()
.then(res) {
this.dispatch(MyActionConstants.CREATE_ACTION_DONE);
return res;
};
}
}
组件
class MyCompoment extends React.Component {
render() {
return(
<div>
<button onChange={ this._clickAction }>Create Me!<button>
</div>
);
}
// private
_clickAction() {
MyActionCreators.create()
// Does this break Flux?
.then((res) => {
this.context.router.transitionTo('some_path', { id: res.id });
});
}
}
商店是获取上述示例中所需信息的唯一合适场所吗?
回答
这确实破坏了 Flux,因为它将状态从存储中移开,并使操作直接与视图通信。
可能的解决方案
对您的系统做出一些假设,我假设您有一个正在尝试更新的路由器。
注意:例子并不完整,它们只是给出了基本的想法。它们也不基于 Flux 架构的任何实现。
商店
创建一个包含该 ID 的商店。商店必须发出某种更改事件。
例子
var Store = function() {
this._id;
Dispatcher.on(MyActionConstants.CREATE_ACTION_DONE, function(payload) {
this._id = payload.id;
this.emit("change");
}.bind(this));
}
Store.prototype.getId = function() {
return this._id;
}
控制器视图
创建一个控制器视图(类似于您的反应组件),它将根据商店中的变化更新路由器。
例子
var store = new Store();
store.on('change', function() {
router.transitionTo('some_path', { id: store.getId() })
});
在组件中执行操作时是否会破坏 Flux 模式以访问组件内操作创建者返回的承诺?
动作创作者
class MyActionCreators extends Marty.ActionCreators {
create() {
this.dispatch(MyActionConstants.CREATE_ACTION);
return MyActionAPI.create()
.then(res) {
this.dispatch(MyActionConstants.CREATE_ACTION_DONE);
return res;
};
}
}
组件
class MyCompoment extends React.Component {
render() {
return(
<div>
<button onChange={ this._clickAction }>Create Me!<button>
</div>
);
}
// private
_clickAction() {
MyActionCreators.create()
// Does this break Flux?
.then((res) => {
this.context.router.transitionTo('some_path', { id: res.id });
});
}
}
商店是获取上述示例中所需信息的唯一合适场所吗?
回答
这确实破坏了 Flux,因为它将状态从存储中移开,并使操作直接与视图通信。
可能的解决方案
对您的系统做出一些假设,我假设您有一个正在尝试更新的路由器。
注意:例子并不完整,它们只是给出了基本的想法。它们也不基于 Flux 架构的任何实现。
商店
创建一个包含该 ID 的商店。商店必须发出某种更改事件。
例子
var Store = function() {
this._id;
Dispatcher.on(MyActionConstants.CREATE_ACTION_DONE, function(payload) {
this._id = payload.id;
this.emit("change");
}.bind(this));
}
Store.prototype.getId = function() {
return this._id;
}
控制器视图
创建一个控制器视图(类似于您的反应组件),它将根据商店中的变化更新路由器。
例子
var store = new Store();
store.on('change', function() {
router.transitionTo('some_path', { id: store.getId() })
});