React-Redux總結(jié)1-基礎(chǔ)

在學(xué)習(xí)react-redux之前我們需要對(duì)redux有個(gè)大概的了解,后面的文章會(huì)介紹redux的中間件和redux在react中的應(yīng)用捍岳。

redux在react中的作用琉朽?

redux的作用非常簡(jiǎn)單高诺,簡(jiǎn)單來說就是幫助我們統(tǒng)一管理react組件的state狀態(tài)。
這在剛開始看來是沒有什么作用并且增加了項(xiàng)目的復(fù)雜度魏蔗,但是當(dāng)組件有大量的變化和異步回調(diào)時(shí),我們面臨的就是一團(tuán)漿糊痹筛,代碼以后也難以維護(hù)莺治,而Redux的作用就是幫助我們解決這個(gè)問題。

安裝

你只需要在項(xiàng)目目錄下執(zhí)行npm install --save redux
但這只是本體帚稠,redux強(qiáng)大之處在于有各種的工具和中間件谣旁,比如可以安裝以下的套餐。

npm install --save redux-actions
npm install --save react-redux
npm install --save redux-thunk
npm install --save redux-promise
npm install --save-dev redux-devtools

Action

Action字面意思就是一個(gè)行為滋早,它的作用就是把更新組件狀態(tài)的每個(gè)動(dòng)作都變?yōu)橐粋€(gè)抽象的行為榄审,比如登錄,請(qǐng)求數(shù)據(jù)杆麸,頁面跳轉(zhuǎn)等等搁进。
本質(zhì)上講Action就是按照規(guī)則定義的對(duì)象,其中type是必須的角溃,定義了Action動(dòng)作的名稱拷获,其他屬性可以自己定義。

{
      type: 'LOGIN_IN',
      payload: 'data'
}

而創(chuàng)建這個(gè)對(duì)象的方法就叫做ActionCreator减细,比如這樣:

function loginIn(name: ?string, pass : ?string) {
    return {
        type:"LOGIN_IN",
        data:{
            username: name,
            password: pass,
        },
    };
}

在redux-actions中提供了createAction方法, 這個(gè)方法會(huì)返回一個(gè)符合FSA標(biāo)準(zhǔn)的ACTION匆瓜。
第一個(gè)參數(shù)是Action的type。
第二個(gè)參數(shù)表示action傳遞的數(shù)據(jù)未蝌,會(huì)被放入創(chuàng)建的action中的payload字段中驮吱。
第三個(gè)參數(shù)會(huì)被放入meta字段中。

createAction(
      'FETCH_POSTS', 
      fetch(`url`)
        .then(response => response.json())
    )

在上面的代碼中我們將一個(gè)網(wǎng)絡(luò)請(qǐng)求promise作為參數(shù)進(jìn)行傳遞萧吠。

Reducer

當(dāng)我們確定了組件的state對(duì)象結(jié)構(gòu)和action行為的時(shí)候就可以編寫reducer了左冬。reducer的作用就是根據(jù)傳入的Action行為和舊的state對(duì)象,返回一個(gè)新的state并刷新組件纸型。

const initialState = {
    isLoggedIn: false,
};
function user(state = initialState, action) {
    if(action.type === 'LOGGED_IN') {
        let {username, password} = action.data;
        return {
            ...state,
            isLoggedIn: true,
            username,
            password,
        };
    }
    return state;
}
export default user;

這里模擬了一個(gè)簡(jiǎn)單的情況拇砰,當(dāng)用戶登錄成功后發(fā)出一個(gè)action,reducer收到后返回新的state狀態(tài)并刷新頁面狰腌。
當(dāng)然我們應(yīng)用可能有多個(gè)reducer的情況, 通過combineReducer可以將多個(gè)reducer合成一個(gè)除破。

import {combineReducers} from 'redux';
import user from './user';
import movieList from './movieList';
module.exports = combineReducers({
    user,
    movieList,
});

reducer的一個(gè)重要特征就是純函數(shù),也就是同樣的輸入琼腔,必須有同樣的輸出瑰枫,有三個(gè)約束需要注意:

*修改傳入?yún)?shù)。
*執(zhí)行有副作用的操作丹莲,如 API 請(qǐng)求和路由跳轉(zhuǎn)光坝。
*調(diào)用非純函數(shù)尸诽,如 Date.now() 或Math.random(), 因?yàn)槊看螘?huì)得到不同的結(jié)果。

也就是說傳入的state如果和舊的state沒有變化盯另,返回的新state也應(yīng)該是一模一樣的性含,不應(yīng)該有沒有任何改變。

store

當(dāng)reducer返回了新的state狀態(tài)后土铺,這個(gè)狀態(tài)怎么傳到組件和存在哪里就成了問題胶滋。
redux就是把這些狀態(tài)統(tǒng)一放入了store進(jìn)行管理。

import { createStore } from 'redux';
const store = createStore(reducers);

這段代碼創(chuàng)建了一個(gè)store并將我們前面合并的reducers注冊(cè)到store中悲敷。
stroe也提供了一些方法供我們調(diào)用:

// 執(zhí)行action究恤, 會(huì)根據(jù)你注冊(cè)的reducer來返回新的state
stroe.disptch(action)
// 注冊(cè)監(jiān)聽器,每當(dāng)action執(zhí)行的時(shí)候就會(huì)被調(diào)用后德,這個(gè)方法比較偏底層部宿,我們一般不會(huì)用到
stroe.subscribe(listener)
// 替換當(dāng)前state中的reducer
stroe.replaceReducer(nextReducer)

流程圖

了解這些我們就能通過發(fā)送Action執(zhí)行一個(gè)大概的流程了:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瓢湃,隨后出現(xiàn)的幾起案子理张,更是在濱河造成了極大的恐慌,老刑警劉巖绵患,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雾叭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡落蝙,警方通過查閱死者的電腦和手機(jī)织狐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筏勒,“玉大人移迫,你說我怎么就攤上這事」苄校” “怎么了厨埋?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捐顷。 經(jīng)常有香客問我荡陷,道長(zhǎng),這世上最難降的妖魔是什么迅涮? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任亲善,我火速辦了婚禮,結(jié)果婚禮上逗柴,老公的妹妹穿的比我還像新娘。我一直安慰自己顿肺,他們只是感情好戏溺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布渣蜗。 她就那樣靜靜地躺著,像睡著了一般旷祸。 火紅的嫁衣襯著肌膚如雪耕拷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天托享,我揣著相機(jī)與錄音骚烧,去河邊找鬼。 笑死闰围,一個(gè)胖子當(dāng)著我的面吹牛赃绊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羡榴,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碧查,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了校仑?” 一聲冷哼從身側(cè)響起忠售,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迄沫,沒想到半個(gè)月后稻扬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羊瘩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年泰佳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片困后。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乐纸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摇予,到底是詐尸還是另有隱情汽绢,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布侧戴,位于F島的核電站宁昭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏酗宋。R本人自食惡果不足惜积仗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜕猫。 院中可真熱鬧寂曹,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渺氧,卻和暖如春旨涝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侣背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工白华, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贩耐。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓弧腥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親憔杨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸟赫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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