? 這是我在公司時候做的一個管理界面的React代碼,當時是因為我leader說Angular坑太多了,所以叫我學習下這個,重做一遍那個項目T_T,于是我就花了一個多月去學習又做了一次T_T所以我也只是入門級水平,發出來是為了記錄一下自己的心得體會,React-Redux、ES6新手可以看看,大神可以選擇忽略或者給我指點一下~ =。=||
項目名字:React-backmanager
項目語言:ES6、ReactJs
模塊分析:三個模塊:CampaignContent、AddNew、BannerDetail
react的三個大模塊的話,不跟angular的一樣,因為react是以組件為單位的,所以整個大模塊也是一個大組件。
用到的關鍵模塊:react-redux、redux、react-router、pubsub-js(這個是維持不變的變量用的。)
redux的作用是維持全局一個store,保持數據的單向流動性。
react-redux就是為了跟react配合要加載的模塊
react-router是我們關鍵的模塊,用于路由.
Redux設計流程分析
1:首先要知道的一個問題就是,數據是單向流動的還是雙向的?沒錯,是單向的,由store來保存一個總數據。通過修改store的數據來實現視圖改變等需求。
2:但是我們知道,其實Redux不單可以和react配合,它也可以跟其他的庫,框架配合使用的,所以對于兩個獨立的庫來說,我們必須得把他們建立一個連接。
基于上面的簡單思考,我們可以有一個思路來寫代碼了:
1:我們先得要創建一個store:
1.1
說白了,store里面就是一堆數據嘛,那么數據怎么來,通過reducer組合而來,所以createStore的時候,就要把初始化的數據傳進來:rootReducer
1.2 rootReducer代碼截圖:
隨著應用越來越大,一方面,不能把所有的數據都放到一個reducer里面,另一方面,為每個reducer創建一個store,后續store的維護就顯得比較麻煩。如何將二者統一起來呢?
所以:通過combineReducers將多個reducer合并成一個rootReducer,雖然這里只有一個。
1.3 reducer的構建:
而這些常量是自己定義的,如下圖:
每次觸發修改store數據的時候,只需要把制定好的動作執行并傳參數進去就可以了。
其實常量也就是這些:
那么我們參數在哪里傳入呢,下面就定義具體的構造如何傳入參數:
這些是action里面的todos我們要執行動作的時候,寫得就是這些小寫的function名字,然后傳入參數。
2:知道數據是怎么弄的,那么接下來我們是要連接redux跟react了:
2.1:就是要使用connect函數來連接:
connect函數需要傳入是要融合為store的reducers,所以傳進去的兩個函數需要返回的是reducers
上面的那個是我們之前看到的那個rootReducer一個叫todos的reducers,里面是直接實時數據
下面的也是傳入reducers,但是需要根據給進去的action指令來修改。
connect是一個高階函數,首先傳入mapStateToProps、mapDispatchToProps,然后返回一個生產
Component
的函數(wrapWithConnect),然后再將真正的Component作為參數傳入wrapWithConnect(MyComponent),這樣就生產出一個經過包裹的Connect組件,該組件具有如下特點:
通過this.context獲取祖先Component的store
props包括stateProps、dispatchProps、parentProps,合并在一起得到
nextState ,作為props傳給真正的Component
componentDidMount時,添加事件this.store.subscribe(this.handleChange),實現頁面交互
shouldComponentUpdate時判斷是否有避免進行渲染,提升頁面性能,并得到nextState
componentWillUnmount時移除注冊的事件this.handleChange
在非生產環境下,帶有熱重載功能
2.2:最后在index里面組裝好App這個主組件跟其他組件的關系,用redux連接起來:
而因為我們需要做一個過渡動畫,所以在App這個組件里面,我們需要:
要加載的模塊有:
PubSub的話,是一個提供可以在不同模塊中還能保持讀取的變量的模塊。
最后是index.html里面在什么地方渲染這些組件:
3:接下來就很簡單地去實現自己要做的構建頁面了:
就是不停地把props跟action從父組件傳到子組件里面使用:
例如,我們在最大的store里面傳入其中的一個BannerDetail組件里面:
我們改變state只能通過setState來改變,然后就會產生實時的變化。
通過對傳入的props來對數據進行改變(this.props.actions)和讀取(this.props.todos)
這是對當面組件里面添加動作時候的寫法,假如組件里面,還要添加小組件的寫法是:
而在EditFolderName組件里面的代碼是:
就是這樣傳入進行處理,跟父組件進行交互就可以了。