React 的單向資料流架構模式
建議將這些元件關注在分離,可做單元測試。
-
Model, store 儲存 (商業邏輯與資料的互動)
-
Controller, dispatch 分配器為應用程式的中樞。算是種單例 Singleton。 (利用 Action 介面定義分配器, Action 也可視為應用程式中的領域特定語言 domain-specific-language)
-
View, view 視圖 (render 渲染應用程式的元件樹)
UI 的每一個動作會送到分配器。 它雖然不是核心元件,但構成分配器的 分配器於資料儲存中, 領域定義語言。(使用者動作被翻譯成分配器動作) 註冊回呼函式, 例如:新增、刪除、修改。 分配器也管理依賴。 Action ------> Dispatcher ------> callbacl | | | V Web API ------> Action Creator Store 封裝商業邏輯與應用程式資料的互動,沒有 setter,新增通過資料儲存的變更事件送回應用程式,更新則通過分配器來到 store。 | | | V button onChange(Event){ input ------ Views <------ return{}; }
// UI Action -> Dispatcher
var App = React.createClass({
// Action
AppAction: {
save: function(){},
delete: function(id){},
update: function(id){},
get: function(res){}
},
// UI Action -> Dispatcher
clickHandler: function(){
// onSave is a Dispather
this.props.onSave(this.state.id);
},
render: function(){
return(
// onClick = {this.method} , this is bind html event to UI action to this class
<div>
<button onClick={this.clickHandler}>
Save Info Now
</button>
</div>
);
}
});
// View -> UI Action
var UIController = React.createClass({
render: function(){
var props = merge(
{}, this.state.app, {onSave = this.saveHandler};
);
return App(props);
}
});
// Dispatcher -> Store
Dispatcher.register(function(payload){
switch(payload.actionType){
case AppConstants.Record: AppStore.save(payload.res);
}
});
// Store -> Event -> View
AppStore.prototype.save = function(res){
this.emitChange();
}
var UI= React.createClass({
changeHandler: function(){
AppStore.listout(function(id){
});
},
componentDidMount: function(){
AppStore.addChangeListener(this.changeHandler);
},
componentWillUnMount: function(){
AppStore.removeChangeListener(this.changeHandler);
}
})
https://www.bookstack.cn/read/reactjs101-zh-tw/Ch07-react-flux-introduction.md