作者:Wang Namelos
鏈接:https://www.zhihu.com/question/41312576/answer/90782136
來源:知乎
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。
解答這個問題并不困難:唯一的要求是你熟悉React。
不要光聽別人描述名詞,理解起來是很困難的。
從需求出發(fā),看看使用React需要什么:
1. React有props和state: props意味著父級分發(fā)下來的屬性,state意味著組件內部可以自行管理的狀態(tài),并且整個React沒有數(shù)據(jù)向上回溯的能力,也就是說數(shù)據(jù)只能單向向下分發(fā),或者自行內部消化。
理解這個是理解React和Redux的前提。
2. 一般構建的React組件內部可能是一個完整的應用,它自己工作良好,你可以通過屬性作為API控制它。但是更多的時候發(fā)現(xiàn)React根本無法讓兩個組件互相交流,使用對方的數(shù)據(jù)。
然后這時候不通過DOM溝通(也就是React體制內)解決的唯一辦法就是提升state,將state放到共有的父組件中來管理,再作為props分發(fā)回子組件。
3. 子組件改變父組件state的辦法只能是通過onClick觸發(fā)父組件聲明好的回調,也就是父組件提前聲明好函數(shù)或方法作為契約描述自己的state將如何變化,再將它同樣作為屬性交給子組件使用。
這樣就出現(xiàn)了一個模式:數(shù)據(jù)總是單向從頂層向下分發(fā)的,但是只有子組件回調在概念上可以回到state頂層影響數(shù)據(jù)。這樣state一定程度上是響應式的。
4. 為了面臨所有可能的擴展問題,最容易想到的辦法就是把所有state集中放到所有組件頂層,然后分發(fā)給所有組件。
5. 為了有更好的state管理,就需要一個庫來作為更專業(yè)的頂層state分發(fā)給所有React應用,這就是Redux。讓我們回來看看重現(xiàn)上面結構的需求:
a. 需要回調通知state (等同于回調參數(shù)) -> action
b. 需要根據(jù)回調處理 (等同于父級方法) -> reducer
c. 需要state (等同于總狀態(tài)) -> store
對Redux來說只有這三個要素:
a. action是純聲明式的數(shù)據(jù)結構,只提供事件的所有要素,不提供邏輯。
b. reducer是一個匹配函數(shù),action的發(fā)送是全局的:所有的reducer都可以捕捉到并匹配與自己相關與否,相關就拿走action中的要素進行邏輯處理,修改store中的狀態(tài),不相關就不對state做處理原樣返回。
c. store負責存儲狀態(tài)并可以被react api回調,發(fā)布action.
當然一般不會直接把兩個庫拿來用,還有一個binding叫react-redux, 提供一個Provider和connect。很多人其實看懂了redux卡在這里。
a. Provider是一個普通組件,可以作為頂層app的分發(fā)點,它只需要store屬性就可以了。它會將state分發(fā)給所有被connect的組件,不管它在哪里,被嵌套多少層。
b. connect是真正的重點,它是一個科里化函數(shù),意思是先接受兩個參數(shù)(數(shù)據(jù)綁定mapStateToProps和事件綁定mapDispatchToProps),再接受一個參數(shù)(將要綁定的組件本身):
mapStateToProps:構建好Redux系統(tǒng)的時候,它會被自動初始化,但是你的React組件并不知道它的存在,因此你需要分揀出你需要的Redux狀態(tài),所以你需要綁定一個函數(shù),它的參數(shù)是state,簡單返回你關心的幾個值。
mapDispatchToProps:聲明好的action作為回調,也可以被注入到組件里,就是通過這個函數(shù),它的參數(shù)是dispatch,通過redux的輔助方法bindActionCreator綁定所有action以及參數(shù)的dispatch,就可以作為屬性在組件里面作為函數(shù)簡單使用了,不需要手動dispatch。這個mapDispatchToProps是可選的,如果不傳這個參數(shù)redux會簡單把dispatch作為屬性注入給組件,可以手動當做store.dispatch使用。這也是為什么要科里化的原因。
做好以上流程Redux和React就可以工作了。簡單地說就是:
1.頂層分發(fā)狀態(tài),讓React組件被動地渲染。
2.監(jiān)聽事件,事件有權利回到所有狀態(tài)頂層影響狀態(tài)。