注意:本文不會把所有知識點(diǎn)都寫一遍剪个,并不適合純新手閱讀
首先Redux是一種狀態(tài)管理方案转质,本身和react并沒有什么聯(lián)系临庇,redux也可以結(jié)合其他框架來用锭汛。
react-redux是基于react的一種狀態(tài)管理實(shí)現(xiàn),他不像vuex那樣直接內(nèi)置在create-react-app里管呵,需要自己去安裝梳毙。
react-redux有三個(gè)重要概念,分別是:store捐下,action账锹,reducer萌业。
1.store。store就是存儲全局?jǐn)?shù)據(jù)狀態(tài)的倉庫奸柬。像這樣:
const initState = {
xxx1: null,
xxx2: null,
};
需要注意的是生年,state是只讀的,意味著我們不能initState.xxx1 = "233"
這樣去修改store里的數(shù)據(jù)廓奕。
其實(shí)抱婉,工作的項(xiàng)目里,倉庫并不是放在store.js里桌粉,store.js里一般是做一些創(chuàng)建store蒸绩,注冊saga的操作,state一般是放在具體模塊的reducer.js里(一個(gè)模塊應(yīng)該有action.js铃肯,reducer.js患亿,saga.js三個(gè)文件)
2.action。
上文說了押逼,state是只讀的步藕,所以我們只能通過派發(fā)action的方式修改store里的數(shù)據(jù)。
派發(fā)action這個(gè)說法我一直覺得很拗口挑格,其實(shí)就是dispatch action的直譯咙冗。
action包含兩部分:type和payload。
type其實(shí)就是action的標(biāo)識恕齐,一個(gè)常量的字符串乞娄,用來說明這個(gè)action是干嘛的,比如說type:"GET_USERNAME"
显歧,說明這個(gè)action是用來獲取username的仪或,payload就是參數(shù)了,就是調(diào)用api需要的參數(shù)士骤。
注意:action是派發(fā)給store的范删。
3.reducer。
reducer接收一個(gè)state和action拷肌,返回一個(gè)state到旦。
store在接收到action之后會把a(bǔ)ction和當(dāng)前的state傳給reducer,然后reducer根據(jù)action的type去判斷執(zhí)行什么樣的操作巨缘,然后返回一個(gè)新的state給store添忘,比如:return {...state,name:"接口獲取到的username"}
。
工作流程圖如下:
這個(gè)流程還是蠻好懂的若锁,接下來我們來說下reducer要注意的地方搁骑。(這里牽扯到我們?yōu)槭裁催€要用redux-saga)
reducer必須是一個(gè)純函數(shù)
純函數(shù)是指一個(gè)函數(shù)的返回結(jié)果只依賴于該函數(shù)傳入的參數(shù),而不能產(chǎn)生副作用
副作用是指異步操作,DOM操作等...
好的仲器,沒明白是吧煤率,說人話,reducer里是不能進(jìn)行異步請求的乏冀!我們在工作中肯定會調(diào)用接口異步獲取數(shù)據(jù)的蝶糯,這樣的話只靠react-redux是無法滿足我們的需求的,而redux-saga就是來解決這個(gè)問題的辆沦。
如果你熟悉vuex昼捍,就知道vuex里有mutation和action,其中mutation提交更新數(shù)據(jù)的方法众辨,只能是同步的端三,而action中就可以包含異步操作了,而且action提交的是mutation鹃彻。
mutation和action的關(guān)系就近似于reducer和saga的關(guān)系:saga里調(diào)用接口獲取到數(shù)據(jù)之后再提交action給reducer,最終返回新的state給store的還是reducer妻献。
saga包含watch-saga函數(shù)和worker-saga函數(shù)蛛株,watch-saga用于監(jiān)聽系統(tǒng)派發(fā)出來的action,watch-saga一旦監(jiān)聽到了某個(gè)action就執(zhí)行對應(yīng)的worker-saga育拨,worker-saga里進(jìn)行異步操作(調(diào)用接口請求數(shù)據(jù)等)谨履,拿到數(shù)據(jù)之后派發(fā)第二個(gè)action給store,store再把state和action給reducer(至此就和無saga時(shí)的流程一樣了)熬丧。
加入了saga笋粟,工作流程發(fā)生了變化:
我們注意到工作流中的action有兩個(gè),可以理解為第一個(gè)action是給watch-saga的析蝴,第二個(gè)action時(shí)異步操作完之后worker-saga給store的害捕。
加入saga后的工作流程如下: