【发布时间】:2015-07-24 17:48:43
【问题描述】:
是否存在用于管理用户与各个组件的交互的既定模式,例如显示加载器微调器、在保存/加载表单时禁用输入字段等?
我发现自己在商店中执行以下操作,以使组件在某种程度上与任何隐含状态脱钩:
function CampaignStore() {
EventEmitter.call(this);
AppDispatcher.register(payload => {
switch (payload.type) {
// [#1] ---------------v (main action)
case CampaignContants.SAVE:
// [#2] ------------------------v (prepare for the main action)
this.emit(CampaignContants.WILL_SAVE);
const data = payload.data;
if (data.id) {
// [#3] ---v (perform main action in store)
updateCampaign(payload.data).then(_ => {
// [#4] ------------------------v (after main action)
this.emit(CampaignContants.DID_SAVE, 0)
});
} else {
insertCampaign(payload.data).then(campaignId => this.emit(CampaignContants.DID_SAVE, campaignId));
}
break;
// ...
}
}
}
基本上,我只是触发一个事件,表示某个动作即将发生,然后我执行该动作(进行 API 调用等),然后在该动作完成时发出另一个事件。
在组件内部,我可以订阅WILL_<action> 事件,渲染所有微调器等,然后在触发DID_<action> 时清除屏幕。虽然这似乎可行,但它确实感觉非常样板和重复,以及超级混乱(太多的状态只能根据动作的位置来调整 UI(在WILL_<action> 和 *DID_<action> 之间)。
// some component
var MyComponent = React.createClass({
getInitialState: function () {
return {
items: [],
loading: false,
saving: false,
checkingPasswordStrength: fase,
// ...
};
},
render: function(){
return (
<div>
{this.state.loading && (
<p>Loading...</p>
)}
{!this.state.loading && (
// Display component in not-loading state
)}
</div>
);
}
});
【问题讨论】:
标签: reactjs design-patterns imperative-programming