摘要:當(dāng)響應(yīng)時(shí),通過(guò)已注冊(cè)的回調(diào)函數(shù),將提供的數(shù)據(jù)負(fù)載發(fā)送給應(yīng)用中的所有。對(duì)外只暴露,不允許提供禁止在任何地方直接操作。是單例作為中的事件分發(fā)中心,同時(shí)還要管理所有中的事件。
React Flux架構(gòu)簡(jiǎn)介
個(gè)人現(xiàn)階段對(duì)Flux架構(gòu)的理解,求拍磚求star!
原文鏈接:https://github.com/kuitos/kuitos.github.io/issues/27
Flux是什么React 簡(jiǎn)介請(qǐng)戳 這里
Flux是Facebook用來(lái)構(gòu)建客戶端web應(yīng)用的應(yīng)用架構(gòu)。它利用單向數(shù)據(jù)流的方式來(lái)組合react中的視圖組件。它更像一個(gè)模式而不是一個(gè)正式的框架,開(kāi)發(fā)者不需要太多的新代碼就可以快速的上手Flux。
Flux的核心部分 1. dispatcher事件調(diào)度中心,flux模型的中心樞紐,管理著Flux應(yīng)用中的所有數(shù)據(jù)流。它本質(zhì)上是Store的回調(diào)注冊(cè)。每個(gè)Store注冊(cè)它自己并提供一個(gè)回調(diào)函數(shù)。當(dāng)Dispatcher響應(yīng)Action時(shí),通過(guò)已注冊(cè)的回調(diào)函數(shù),將Action提供的數(shù)據(jù)負(fù)載發(fā)送給應(yīng)用中的所有Store。應(yīng)用層級(jí)單例?。?/p> 2. store
負(fù)責(zé)封裝應(yīng)用的業(yè)務(wù)邏輯跟數(shù)據(jù)的交互。
Store中包含應(yīng)用所有的數(shù)據(jù)
Store是應(yīng)用中唯一的數(shù)據(jù)發(fā)生變更的地方
Store中沒(méi)有賦值接口---所有數(shù)據(jù)變更都是由dispatcher發(fā)送到store,新的數(shù)據(jù)隨著Store觸發(fā)的change事件傳回view。Store對(duì)外只暴露getter,不允許提供setter?。〗乖谌魏蔚胤街苯硬僮鱏tore。
3. viewcontroller-view 可以理解成MVC模型中的controller,它一般由應(yīng)用的頂層容器充當(dāng),負(fù)責(zé)從store中獲取數(shù)據(jù)并將數(shù)據(jù)傳遞到子組件中。簡(jiǎn)單的應(yīng)用一般只有一個(gè)controller-view,復(fù)雜應(yīng)用中也可以有多個(gè)。controller-view是應(yīng)用中唯一可以操作state的地方(setState())
view(UI組件) ui-component 職責(zé)單一只允許調(diào)用action觸發(fā)事件,數(shù)據(jù)從由上層容器通過(guò)屬性傳遞過(guò)來(lái)。
4. 其他action creators 作為dispatcher的輔助函數(shù),通常可以認(rèn)為是Flux中的第四部分。ActionCreators是相對(duì)獨(dú)立的,它作為語(yǔ)法上的輔助函數(shù)以action的形式使得dispatcher傳遞數(shù)據(jù)更為便利。
How Flux(Unidirectional Data Flow) Works
view --> actionCreators
// Nav.jsx export default class Nav extends React.Component { _handleClick(nav) { NavActionCreators.clickNav(nav); } render() { let itemList = this.props.list.map((nav, index) => { return (
action dispatch
// NavActionCreators.js export default { clickNav(nav){ AppDispatcher.dispatch( { type: ActionTypes.CLICK_NAV, nav } ); } };
dispatcher --> store callback
AppDispatcher.register(action => { switch (action.type) { // nav點(diǎn)擊 case ActionTypes.CLICK_NAV: IndexWebAPIUtils.getGiftList(_currentUserInfo.userId, action.nav.id) .then(function (giftList) { _currentGiftList = giftList; IndexStore.emitChange(); }); break; // no default } });
store emitChange --> controller view --> setState
export default class Index extends React.Component { constructor(props) { super(props); let currentUser = UserStore.getCurrentUser(); this.state = IndexStore.getAll(); } componentDidMount() { IndexStore.addChangeListener(this._onChange.bind(this)); } componentWillUnmount() { IndexStore.removeChangeListener(this._onChange.bind(this)) } _onChange() { this.setState(IndexStore.getAll()); } render() { let state = this.state; return (Flux vs MVVM...); } }
因?yàn)閍ngular雙向綁定的原因,我們永遠(yuǎn)無(wú)法知道數(shù)據(jù)在哪一刻處于穩(wěn)定狀態(tài),所以我們經(jīng)常會(huì)在angular中看到通過(guò)setTimeout的方式處理一些問(wèn)題(其實(shí)有更優(yōu)雅的解決方案,不在本次討論之內(nèi))。同時(shí)由于雙向綁定的原因,行為的流向我們也很難預(yù)測(cè),當(dāng)視圖的model變多的時(shí)候,如果再加上一堆子視圖依賴這些model,問(wèn)題發(fā)生時(shí)定位簡(jiǎn)直是噩夢(mèng)啊(這也是angular的錯(cuò)誤信息那么不友好的原因,因?yàn)榭蚣荛_(kāi)發(fā)者也無(wú)法確定當(dāng)前行為是誰(shuí)觸發(fā)的啊,綁定的人太多了...)。但是這里還是要強(qiáng)調(diào)一點(diǎn)就是,并不是說(shuō)雙向綁定就一定會(huì)導(dǎo)致不穩(wěn)定的數(shù)據(jù)狀態(tài),在angular中我們通過(guò)一些手段依然可以使得數(shù)據(jù)變得穩(wěn)定,只是雙向綁定(mvvm)相對(duì)于flux更容易引發(fā)數(shù)據(jù)不穩(wěn)定的問(wèn)題。
2. 所有的數(shù)據(jù)變更都發(fā)生在store里flux里view是不允許直接修改store的,view能做的只是觸發(fā)action,然后action通過(guò)dispatcher調(diào)度最后才會(huì)流到store。所有數(shù)據(jù)的更改都發(fā)生在store組件內(nèi)部,store對(duì)外只提供get接口,set行為都發(fā)生在內(nèi)部。store里包含所有相關(guān)的數(shù)據(jù)及業(yè)務(wù)邏輯。所有store相關(guān)數(shù)據(jù)處理邏輯都集中在一起,避免業(yè)務(wù)邏輯分散降低維護(hù)成本。
3. 數(shù)據(jù)的渲染是自上而下的view所有的數(shù)據(jù)來(lái)源只應(yīng)該是從屬性中傳遞過(guò)來(lái)的,view的所有表現(xiàn)由上層控制視圖(controller-view)的狀態(tài)決定。我們可以把controller-view理解為容器組件,這個(gè)容器組件中包含若干細(xì)小的子組件,容器組件不同的狀態(tài)對(duì)應(yīng)不同的數(shù)據(jù),子組件不能有自己的狀態(tài)。也就是,數(shù)據(jù)由store傳遞到controller-view中之后,controller-view通過(guò)setState將數(shù)據(jù)通過(guò)屬性的方式自上而下傳遞給各個(gè)子view。
4. view層變得很薄,真正的組件化由于2、3兩條原因,view自身需要做的事情就變得很少了。業(yè)務(wù)邏輯被store做了,狀態(tài)變更被controller-view做了,view自己需要做的只是根據(jù)交互觸發(fā)不同的action,僅此而已。這樣帶來(lái)的好處就是,整個(gè)view層變得很薄很純粹,完全的只關(guān)注ui層的交互,各個(gè)view組件之前完全是松耦合的,大大提高了view組件的復(fù)用性。
5. dispatcher是單例的對(duì)單個(gè)應(yīng)用而言dispatcher是單例的,最主要的是dispatcher是數(shù)據(jù)的分發(fā)中心,所有的數(shù)據(jù)都需要流經(jīng)dispatcher,dispatcher管理不同action于store之間的關(guān)系。因?yàn)樗袛?shù)據(jù)都必須在dispatcher這里留下一筆,基于此我們可以做很多有趣的事情,各種debug工具、動(dòng)作回滾、日志記錄甚至權(quán)限攔截之類(lèi)的都是可以的。
Flux的困境 1. 過(guò)多的樣板代碼flux只是一個(gè)架構(gòu)模式,并不是一個(gè)已實(shí)現(xiàn)好的框架,所以基于這個(gè)模式我們需要寫(xiě)很多樣板代碼,代碼量duang的一下子上來(lái)了。。不過(guò)好在目前已經(jīng)有很多好用的基于flux的第三方實(shí)現(xiàn),目前最火的屬redux。
2. dispatcher是單例dispatcher作為flux中的事件分發(fā)中心,同時(shí)還要管理所有store中的事件。當(dāng)應(yīng)用中事件一多起來(lái)事件時(shí)序的管理變得復(fù)雜難以維護(hù),沒(méi)有一個(gè)統(tǒng)一的地方能清晰的表達(dá)出dispatcher管理了哪些store。
3. 異步處理到底寫(xiě)在哪里按flux流程,action中處理:依賴該action的組件被迫耦合進(jìn)業(yè)務(wù)邏輯
按store職責(zé)在store中處理:store狀態(tài)變得不穩(wěn)定,dispatcher的waitFor失效
4. 至今還沒(méi)有官方實(shí)現(xiàn) 寫(xiě)在最后前端摩爾定律:前端每18個(gè)月難度增加一倍
沒(méi)有銀彈
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92346.html
摘要:譯者按最近依舊如火如荼相信大家都躍躍欲試我們團(tuán)隊(duì)也開(kāi)始在領(lǐng)域有所嘗試年應(yīng)該是逐漸走向成熟的一年讓我們一起來(lái)看看國(guó)外的開(kāi)發(fā)者們都總結(jié)了哪些最佳實(shí)踐年在全世界都有很多關(guān)于新的更新和開(kāi)發(fā)者大會(huì)的討論關(guān)于去年的重要事件請(qǐng)參考那么年最有趣的問(wèn)題來(lái)了我 譯者按:最近React(web/native)依舊如火如荼,相信大家都躍躍欲試,我們團(tuán)隊(duì)也開(kāi)始在React領(lǐng)域有所嘗試. 2016年應(yīng)該是Reac...
摘要:關(guān)于的思考是一種前端狀態(tài)管理架構(gòu)思想,專門(mén)解決軟件的結(jié)構(gòu)問(wèn)題。他們給出了一些庫(kù)用于實(shí)現(xiàn)的思想,并在的基礎(chǔ)上做了一些改進(jìn)。在這些框架里,當(dāng)前最熱門(mén)的莫過(guò)于和了。 關(guān)于Flux,Vuex,Redux的思考 Flux是一種前端狀態(tài)管理架構(gòu)思想,專門(mén)解決軟件的結(jié)構(gòu)問(wèn)題。基于Flux的設(shè)計(jì)思想,出現(xiàn)了一批前端狀態(tài)管理框架。他們給出了一些庫(kù)用于實(shí)現(xiàn)Flux的思想,并在Flux的基礎(chǔ)上做了一些改進(jìn)。...
摘要:應(yīng)用這說(shuō)明并不是單指設(shè)計(jì)給用的,它是獨(dú)立的一個(gè)函數(shù)庫(kù),可通用于各種應(yīng)用。在數(shù)據(jù)流的最后,要觸發(fā)最上層組件的,然后進(jìn)行整體的重新渲染工作。單純?cè)诘膶?duì)象上是沒(méi)有辦法使用,要靠額外的函數(shù)庫(kù)才能這樣作,這是一定要使用類(lèi)似像這種函數(shù)庫(kù)的主要原因。 Redux的官網(wǎng)中用一句話來(lái)說(shuō)明Redux是什么: Redux是針對(duì)JavaScript應(yīng)用的可預(yù)測(cè)狀態(tài)容器 這句話雖然簡(jiǎn)短,其實(shí)是有幾個(gè)涵義的: ...
摘要:原文地址由于只涉及層的處理,所以構(gòu)建大型應(yīng)用應(yīng)該搭配一個(gè)框架模式才能使后期維護(hù)成本相對(duì)較小正是官方給出的應(yīng)用架構(gòu),他推崇一種單向的數(shù)據(jù)流動(dòng)模式,看下圖感受下整個(gè)流程是用戶與層交互,觸發(fā)使用進(jìn)行分發(fā)觸發(fā)回調(diào)進(jìn)行更新更新觸發(fā)層事件層收到信號(hào)進(jìn) 原文地址:https://gmiam.com/post/react-... 由于 React 只涉及 UI 層的處理,所以構(gòu)建大型應(yīng)用應(yīng)該搭配一個(gè)框...
摘要:是的架構(gòu)的實(shí)現(xiàn)。是在年提出的一種前端架構(gòu),主要用來(lái)處理復(fù)雜的邏輯的一致性問(wèn)題當(dāng)時(shí)是為了解決頁(yè)面的消息通知問(wèn)題。 去年10月底來(lái)到了新公司,剛開(kāi)始接手 Android 項(xiàng)目時(shí),發(fā)現(xiàn)該項(xiàng)目真的是一團(tuán)遭,項(xiàng)目開(kāi)發(fā)上沒(méi)有任何架構(gòu)可言,開(kāi)發(fā)人員連簡(jiǎn)單的 MVC、MVP 都不了解,Activity 及其臃腫,業(yè)務(wù)邊界也不明確,因此我決定重新分析一下當(dāng)前主流的幾種開(kāi)發(fā)架構(gòu),選出適合當(dāng)前項(xiàng)目的架構(gòu)形式...
閱讀 3229·2021-11-12 10:36
閱讀 1304·2019-08-30 15:56
閱讀 2455·2019-08-30 11:26
閱讀 563·2019-08-29 13:00
閱讀 3622·2019-08-28 18:08
閱讀 2763·2019-08-26 17:18
閱讀 1914·2019-08-26 13:26
閱讀 2443·2019-08-26 11:39