redux

redux

  1. 下載redux工具
    cnpm i redux -S

  2. 創(chuàng)建store

const store = createStore(reducer)

  1. 創(chuàng)建reducer純函數(shù)

  2. 為store掛載默認(rèn)狀態(tài)

為reducer的state參數(shù)設(shè)置默認(rèn)值,再返回出新的state,這樣的話捡偏,store就有state了

  1. 組件使用store的state

組件通過調(diào)用store.getState()來獲得store中的state

  1. 創(chuàng)建actionCreator

actionCreator里的方法菠发,作用是執(zhí)行一些自定邏輯之后已骇,創(chuàng)建一個帶有標(biāo)識性信息的action钞它,交由reducer處理

?
let action = {
type: _TODO,//_TOOD 是一個常量
todos
}
store.dispatch(action)

  1. 在reducer中,根據(jù)action上的標(biāo)識信息做出判斷之后柿扣,返回一個新狀態(tài)章贞,這個時候store里的狀態(tài)已經(jīng)更改了

import _state from './state'
import {
_TODO, //定義的常量
} from './const'
const reducer = ( state = _state, action) => {
let new_state = Object.assign({}, state)//此方法為原生方法祥绞,作用看最后面注釋

switch ( action.type ) {
  case _TODO:;break;

  default:break;
}

//reducer一定要返回狀態(tài)
return new_state

}

export default reducer

  1. 讓組件去獲取最新的狀態(tài)

在組件的初始化階段的生命周期鉤子函數(shù)componentWillMount () {}中給store.subscribe傳入回調(diào)函數(shù),當(dāng)狀態(tài)更改的時候這個回調(diào)函數(shù)就會觸發(fā),在這個回調(diào)里就可以讓組件獲取最新的狀態(tài)之后進(jìn)行setState蜕径,當(dāng)然两踏,如果發(fā)現(xiàn)所用的狀態(tài)沒有更改可以做出判斷來決定是否進(jìn)行setState

componentWillMount () {
//當(dāng)store里的zhuangt改變的時候,store.subscribe方法里傳入的函數(shù)就會執(zhí)行
store.subscribe(() => {
this.setState({todos: store.getState().todos})
})
}

reducer劃分

當(dāng)我們協(xié)同開發(fā)的時候兜喻,或者項目獨立功能模塊較多的時候梦染,把狀態(tài)放在一個reducer中處理的話會導(dǎo)致更新維護(hù)比較麻煩

在這里我們研究將store進(jìn)行模塊化的管理

actionCreator、state本身與store耦合度很低虹统,最主要的是把reducer拆分開

我們可以利用combindReducers函數(shù)弓坞,將分離開的renducer整合成一個,這樣的話车荔,需要注意的是在使用的時候,state也會根據(jù)劃分的reducer有一個不同的分布

react-redux

這是一個好東西戚扳!

對比redux與vue中的vuex忧便,vuex要比redux用起來簡單、方便帽借!

因為vuex是vue的一個工具珠增、插件,與vue的耦合度高砍艾,所以里面很多東西作者已經(jīng)給我們封裝好了

但是redux不只是react可以用蒂教,很多地方都能去用,所以在react中使用redux的時候脆荷,很多東西都需要我們自己寫~

麻煩的地方:

  1. 組件獲取狀態(tài)較為麻煩
  2. 狀態(tài)更新之后凝垛,組件需要手動的獲取最新狀態(tài)
  3. 組件使用actionCreator的方法也不是很方便

所以現(xiàn)在學(xué)習(xí)使用react-redux工具,這個工具是準(zhǔn)么將react和redux連接起來的

下載 npm i react-redux -S

在react-redux中蜓谋,有一個概念:

組件應(yīng)該劃分一下類別:容器組件(智能組件)梦皮、UI組件(木偶組件)

這樣的話,任何一個組件都可以分離成一個容器組件和一個UI組件的組合

容器組件去和store進(jìn)行交互桃焕,獲取狀態(tài)...然后再將這些東西傳遞給UI組件剑肯,UI組件從屬性里接收基于可以了

容器組件可以利用react-redux去根據(jù)現(xiàn)有的UI組件去自動生成

也就是說只是要需要和store進(jìn)行交互的組件,我們就將其處理成容器組件和UI組件的結(jié)合观堂,我們只需要寫UI組件就可以了让网,容器組件會自動生成的

使用方法:

  1. 在根組件外部包裹上Provider組件,并為其傳入store

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

目的师痕,讓Provider里面的所有的容器組件都可以使用到store里的東西

Provider是通過context屬性將自己的東西傳遞到內(nèi)部子級組件中的

  1. 把需要使用到全局狀態(tài)的組件處理成容器組件和UI組件

  2. ContainerComponnet = connect()(UIComponent)

    讓容器組件將自己context里的store相關(guān)的東西傳遞給UI組件

  3. actionCreator的方法只負(fù)責(zé)創(chuàng)建對應(yīng)的action就可以了溃睹,無需再去dispatch

  4. 現(xiàn)在要讓組件去調(diào)用store.dispatch,也就是說讓組件得到store.dispatch的方法七兜,這也屬性在使用store的東西丸凭,這個時候也要生成一個容器組件

    傳入mapDispatchToProps方法可以將一些方法傳入到UI組件的屬性上,而這些方法都能調(diào)用到dispatch,將actionCreator創(chuàng)建好的action傳入到dispatch里就可以了

  5. 可以利用bindActionCreators將actionCreator的方法處理一下產(chǎn)生新方法惜犀,在新方法里已經(jīng)自動的將原方法里產(chǎn)生action給dispatch了

  6. 這個時候铛碑,actionCreator變得純粹了很多,不用去dispatch虽界,專注的返回action就可以了汽烦,但是,如果我們有異步動作的話莉御,現(xiàn)在放在action里直接不生效了

    在這里撇吞,我們使用redux的中間件來處理,redux的中間件有很多:redux-thunk礁叔、redux-promise牍颈、redux-saga......

    在這里我們學(xué)習(xí)使用redux-thunk

redux-thunk的使用方法

  1. npm i redux-thunk -S
  1. 將thunk中間在在創(chuàng)建store的時候加入進(jìn)去

import { createStore, applyMiddleware } from 'redux'

import thunk from 'redux-thunk'

import reducer from './reducer'

const store = createStore(reducer, applyMiddleware(thunk))

  1. actionCreator里的方法就可以返回一個函數(shù)。這個函數(shù)會接收到dispatch

    所以琅关,如果有異步的動作煮岁,就在對應(yīng)的actionCreator的方法里返回一個接收到dispatch的函數(shù),在這個函數(shù)中創(chuàng)建action再手動的dispatch

注釋:

Object.assign()方法的用法
合并多個對象

克隆對象(淺)涣易;

為對象添加多個方法

Object.assign(SomeClass.prototype, {
someMethod(arg1, arg2) {
},
anotherMethod() {
}
});?
// 原來的方法
SomeClass.prototype.someMethod = function (arg1, arg2) {
};
SomeClass.prototype.anotherMethod = function () {
};

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末画机,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子新症,更是在濱河造成了極大的恐慌步氏,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徒爹,死亡現(xiàn)場離奇詭異荚醒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瀑焦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門腌且,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人榛瓮,你說我怎么就攤上這事铺董。” “怎么了禀晓?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵精续,是天一觀的道長。 經(jīng)常有香客問我粹懒,道長重付,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任凫乖,我火速辦了婚禮确垫,結(jié)果婚禮上弓颈,老公的妹妹穿的比我還像新娘。我一直安慰自己删掀,他們只是感情好翔冀,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著披泪,像睡著了一般纤子。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上款票,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天控硼,我揣著相機(jī)與錄音,去河邊找鬼艾少。 笑死卡乾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姆钉。 我是一名探鬼主播说订,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼潮瓶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钙姊,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤毯辅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后煞额,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體思恐,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年膊毁,在試婚紗的時候發(fā)現(xiàn)自己被綠了胀莹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡婚温,死狀恐怖描焰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栅螟,我是刑警寧澤荆秦,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站力图,受9級特大地震影響步绸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吃媒,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一瓤介、第九天 我趴在偏房一處隱蔽的房頂上張望吕喘。 院中可真熱鬧,春花似錦刑桑、人聲如沸氯质。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽病梢。三九已至,卻和暖如春梁肿,著一層夾襖步出監(jiān)牢的瞬間蜓陌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工吩蔑, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留钮热,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓烛芬,卻偏偏與公主長得像隧期,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赘娄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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