弄清原理之Redux combineReducers

Redux reducer的作用

只用來處理state 變化,返回新的state

//previousState是初始化的state
//經(jīng)過reducer后,state變?yōu)閚extState
const someReducer = (previousState, action) =>{
  return nextState;
}

reducer composition patten

reducer 組合模式---combineReducers的前身,直接看代碼

const initialState = {
  count: 0,
  alert: { visible: false, message: '' }
};
const rootReducer = (state = initialState, action) => ({
  count: counterReducer(state.counter, action),
  alert: alertReducer(state.alert, action)
});
  • 拿一個(gè)總的rootReducer對象組合了兩個(gè)countalert對象
    ,這時(shí)state tree里有{count:counterReducer返回的state,alert:alertReducer返回的state},由于state tree保存在store中,所以現(xiàn)有的state保存在了store中

combineReducers

做了那么多鋪墊,現(xiàn)在說說combineReducers

1.是一種composition solution(前面提到過組合模式)的解決辦法,合并多個(gè)reducers為一個(gè)reducer
2.返回的是一個(gè)對象,這個(gè)對象可看出state tree filed names和管理該state的reducer之間的映射
3.形式是:

import {combineReducers} from '../lib/redux';
import count from './count';
import alert from './alert';

const rootReducer = combineReducers({
  count:count
  alert:alert
});

export default rootReducer;

This combineReducer call translates to: "our state tree consists of two different properties, count and alert, which will be handled by the counter and alert reducers respectively".
4.手動(dòng)實(shí)現(xiàn)combineReducers函數(shù)

import count from './count';
import alert from './alert';
//實(shí)現(xiàn)combineReducers函數(shù)
const combineReducers = (reducers) => {
  return (state = {}, action) => {
    return Object.keys(reducers).reduce((nextState, key) => {
       //key: count,key
       //state[key]:當(dāng)前遍歷的reducer先前的state值
       //nextState[key]:當(dāng)前遍歷的reducer變化后的state值
        nextState[key] = reducers[key](state[key], action);
        return nextState;
      }, {}); 
    };
};
//調(diào)用combineReducers,傳入所有的reducers
const reducers = combineReducers({
    count,
    alert
})
export default reducers;

注意,reduce高階函數(shù)第二個(gè)參數(shù)初始為{},遍歷reducers的每個(gè)reducer,給nextState[key]賦值, 并push nextState到第二個(gè)參數(shù){}中.

自己寫了個(gè)demo

每天努力一點(diǎn)點(diǎn)
謝謝你看完


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姐仅,一起剝皮案震驚了整個(gè)濱河市花枫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掏膏,老刑警劉巖劳翰,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馒疹,居然都是意外死亡佳簸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門颖变,熙熙樓的掌柜王于貴愁眉苦臉地迎上來生均,“玉大人,你說我怎么就攤上這事腥刹÷黼剩” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵衔峰,是天一觀的道長漓雅。 經(jīng)常有香客問我录别,道長,這世上最難降的妖魔是什么邻吞? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮葫男,結(jié)果婚禮上抱冷,老公的妹妹穿的比我還像新娘。我一直安慰自己梢褐,他們只是感情好旺遮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盈咳,像睡著了一般耿眉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鱼响,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天鸣剪,我揣著相機(jī)與錄音,去河邊找鬼丈积。 笑死筐骇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的江滨。 我是一名探鬼主播铛纬,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唬滑!你這毒婦竟也來了告唆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晶密,失蹤者是張志新(化名)和其女友劉穎擒悬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惹挟,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茄螃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了连锯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片归苍。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖运怖,靈堂內(nèi)的尸體忽然破棺而出拼弃,到底是詐尸還是另有隱情,我是刑警寧澤摇展,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布吻氧,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盯孙。R本人自食惡果不足惜鲁森,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望振惰。 院中可真熱鬧歌溉,春花似錦、人聲如沸骑晶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桶蛔。三九已至匙头,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仔雷,已是汗流浹背蹂析。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朽寞,地道東北人识窿。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像脑融,于是被迫代替她去往敵國和親喻频。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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