如何初始化整個redux應用?
我們知道整個redux的數據是存儲在根結點的context,
那麼問題來了,如果我的redux應用是作為頁面上的一個子組件我如何刷新這個子組件回到初始的狀態(刷新按鈕在redux應用之外)?
首先,Redux的store也不是一定要存在於根節點上,可以存在於任何一層,雖然官方認為一個網頁中一個Store足夠,但是也沒有阻止我們在一個網頁中使用多個Store。
如果Redux應用作為頁面的一個子組件,想要讓子組件回到初始狀態,也很簡單,Redux中改變Store的狀態,就是要靠action,給這個Store派發一個重新初始化狀態的action就行。這樣,問題就成了,如何給在子組件之外給這個子組件發射一個action。
在初始化Store的時候,可以把對Store的應用掛在一個全局變數上,比如這樣。
const store = window.store = createStore(...);
這樣,就可以通過 window.store 來派發action了,但是獲得action的引用又成了問題,所以乾脆這樣。
const store = createStore(...);
window.resetState = () =&> {
store.dispatch(init());
}
這樣,子組件之外通過調用 window.resetState() 就可以重設狀態了。
拿到store引用,然後dispatch一個action,reducer接到action返回你的initialState。
首先,dispatch是必須的,人家就是這樣設計的。
那麼剩下的問題就是如何快速接收到這個dispacth帶來的變化,而不是經過一層層props傳遞。
react-redux中有個叫connect的函數。
使用react的context屬性將根store的屬性直接map到你指定組件的props上。
這時你可以dispatch一個action。
然後可以在你的組件中直接取`http://this.props.xxx`。
https://github.com/yupeifeng/reducermanager這是我自己基於redux 封裝
(1)處理Redux的reducer集中管理的問題(2)防止action的type重複問題
(3)離開頁面再次進入該頁面的數據初始化問題
推薦閱讀:
※《深入 React 技術棧》章節試讀
※用 Three.js, React 和 WebGL 開發遊戲 — SitePoint
※React Loadable 簡介
※掌握這5大核心概念,你就理解了React
※React 模態框秘密和「輪子」漸進設計