是否存在用于管理用户与各个组件的交互的既定模式,例如显示加载器微调器、在表单保存/加载时禁用输入字段等?
我发现自己在商店中执行以下操作,以使组件在某种程度上与任何隐含状态脱钩:
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>
触发时清除屏幕。虽然这似乎可行,但它确实感觉非常样板和重复,以及超级混乱(太多的状态只存在于根据动作的位置(在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>
);
}
});