標籤:

如何初始化整個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 模態框秘密和「輪子」漸進設計

TAG:React | Redux |