狀態(tài)管理-redux

定義:redux 是React技術(shù)棧使用最為廣泛的狀態(tài)管理奶赠。一款個人作用,基于 Flux數(shù)據(jù)架構(gòu)思想的開源工具。

牢記三個三

1故源、第一個“三”(3個api):createStore紊遵、combineReducers账千、applyMiddleware

2、第二個“三”(3個特點(diǎn)):單一數(shù)據(jù)源暗膜、store是只讀的匀奏、使用reducer純函數(shù)來修改store。

3学搜、第三個“三”(3個概念):State娃善、Action论衍、Reducer。

store

store.getState() 用于獲取store中所有的state

store.subscribe() 用于添加一個change事件聚磺,監(jiān)聽store變化

store.dispatch() 用于派發(fā)一個action

redux集成

1坯台、環(huán)境配置

cnpm i redux -S

cnpm i react-redux -S

cnpm i redux-thunk -S

第一步,構(gòu)建store的邏輯

const store = createStore(

combineReducers({good,user,...}),

compose( applyMiddleware(ReduxThunk),

applyMiddleware(ReduxLogger),

...

) )


import produce from 'immer'

function reducer(state=initState, action) {

return produce(state, newState=>{

switch(action.type) { case '': }

})

}

export default reducer

第二步,連接redux和react

function App() {

return (

<Provider store={store}> </Provider>

)

}

第三步,在react組件中使用store

1、如果是類組件, 只能使用 connect() 高階組件

@connect(

state=>({msg:state.user.msg, ....}),

dispatch=>({changeMsg:(payload)=>dispatch({type,payload})}) )

class Home extends PureComponent {

}

export default Home

class Home extends PureComponent {?

}

export default connect(

state=>({msg:state.user.msg, ....}),

dispatch=>({changeMsg:(payload)=>dispatch({type,payload})})

)(Home)

2瘫寝、如果是函數(shù)式組件, 使用 connect() 高階組件

export default connect(

state=>({msg:state.user.msg, ....}),

dispatch=>({changeMsg:(payload)=>dispatch({type,payload})})

)(props=>(<div></div>))

3蜒蕾、如果是函數(shù)式組件(react v16.8),還可以使用react-redux的hooks寫法

export default () => {

? const msg = useSelector(state=>state.user.msg)

? const dispatch = useDispatch()

}

重新梳理redux中的三個概念

store, 如何創(chuàng)建store, store有哪三個特點(diǎn)(單一數(shù)據(jù)源,只讀的,只能使用reducer來修改store)

action, 是一個plain object, 它是固定格式的{type:'信號',payload:'負(fù)載'},你可以把它理解成是"一封郵件", action是給dispatch(action)用的,這表示的是"一個業(yè)務(wù)邏輯".

從redux架構(gòu)的角度,思考下面幾個問題?

1、為什么要把redux架構(gòu)中的所有type抽離成常量,并且放在同一個type文件中?

就是為了低耦合,避免協(xié)同開發(fā)中對type賦值沖突的問題(如果type沖突,"信號"就沖突了,那么redux工作中肯定出現(xiàn)bug,這也違背了"單向數(shù)據(jù)流"的設(shè)計理念).

2矢沿、redux默認(rèn)不支持異步調(diào)接口, redux的store如果接收到了一個非action={type,payload}的信號時,會報錯. 那該怎么辦呢?

使用redux-thunk來解決問題. redux-thunk這個中間件作用是在store收到信號時對"信號"的數(shù)據(jù)類型進(jìn)行判斷,如果function類型,redux-thunk就調(diào)用這個funciton并把dispatch傳遞這個function,還會攔截掉這個function, 所以這個function就不會抵達(dá)reducer.

3滥搭、為什么要封裝"action生成器"?

其一是為了把業(yè)務(wù)邏輯(調(diào)接口的邏輯)從react組件中抽離出來,?

其二是action可以被復(fù)用.(在這里,你可把"action生成器"理解成一個具體的業(yè)務(wù)邏輯).

redux原理? redux和mobx有什么區(qū)別?分別有什么優(yōu)勢和劣勢?

redux是基于事件監(jiān)聽,react上下文,高階組件來實(shí)現(xiàn)的, 比較適用中大型項目.

mobx是典型的響應(yīng)式的狀態(tài)管理工具, 比較適用于中小型項目.

擴(kuò)展

一、如何封裝connect()?

首先要理解connect到底在做什么? mapStateToProps把store.getState()中的數(shù)據(jù)添加到當(dāng)前UI組件的props上, mapDispatchToProps給當(dāng)前UI組件的props方法注入store.dipatch這個API, connect()還做了另一件重要的事,在當(dāng)前UI組件中監(jiān)聽store變化.

思路1: 編寫類組件,使用 contextType接收ReactReduxContext上下文(也就是說你在當(dāng)前UI組件中就拿到了store數(shù)據(jù)), 在componentDidMount()監(jiān)聽store的變化,當(dāng)store變化時強(qiáng)制更新頁面.

思路2: 編寫函數(shù)式組件, 使用useContext()拿到上下文(就是拿到了store數(shù)據(jù)),在useEffect()監(jiān)聽store變化,當(dāng)store變化時set*方法觸發(fā)當(dāng)前組件更新.

二捣鲸、如何封裝useSelector()?

它所做的事情和connect()是一樣的. 使用useState/useReducer都能實(shí)現(xiàn).

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瑟匆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子栽惶,更是在濱河造成了極大的恐慌愁溜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件外厂,死亡現(xiàn)場離奇詭異冕象,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)汁蝶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門渐扮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掖棉,你說我怎么就攤上這事墓律。” “怎么了幔亥?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵耻讽,是天一觀的道長。 經(jīng)常有香客問我帕棉,道長针肥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任香伴,我火速辦了婚禮慰枕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘即纲。我一直安慰自己具帮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匕坯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拔稳。 梳的紋絲不亂的頭發(fā)上葛峻,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音巴比,去河邊找鬼术奖。 笑死,一個胖子當(dāng)著我的面吹牛轻绞,可吹牛的內(nèi)容都是我干的采记。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼政勃,長吁一口氣:“原來是場噩夢啊……” “哼唧龄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奸远,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤既棺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后懒叛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丸冕,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年薛窥,在試婚紗的時候發(fā)現(xiàn)自己被綠了胖烛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡诅迷,死狀恐怖佩番,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竟贯,我是刑警寧澤答捕,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站屑那,受9級特大地震影響拱镐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜持际,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一沃琅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜘欲,春花似錦益眉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽年碘。三九已至,卻和暖如春展鸡,著一層夾襖步出監(jiān)牢的瞬間屿衅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工莹弊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涤久,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓忍弛,卻偏偏與公主長得像响迂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子细疚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容