Redux 入門教程

今天說一下最近用到的Redux具滴,以前看過的很好的文章晓勇,我加以引用和自己的理解米奸。

React 只是 DOM 的一個(gè)抽象層昼接,并不是 Web 應(yīng)用的完整解決方案。有兩個(gè)方面悴晰,它沒涉及慢睡。

代碼結(jié)構(gòu)

組件之間的通信

對于大型的復(fù)雜應(yīng)用來說,這兩方面恰恰是最關(guān)鍵的铡溪。因此漂辐,只用 React 沒法寫大型應(yīng)用。

為了解決這個(gè)問題棕硫,2014年 Facebook 提出了Flux架構(gòu)的概念髓涯,引發(fā)了很多的實(shí)現(xiàn)。2015年饲帅,Redux出現(xiàn)复凳,將 Flux 與函數(shù)式編程結(jié)合一起,很短時(shí)間內(nèi)就成為了最熱門的前端架構(gòu)灶泵。

本文詳細(xì)介紹 Redux 架構(gòu)育八,由于內(nèi)容較多,全文分成三個(gè)部分赦邻。今天是第一部分髓棋,介紹基本概念和用法。

一、預(yù)備知識


閱讀本文按声,你只需要懂 React膳犹。如果還懂 Flux,就更好了签则,會比較容易理解一些概念须床,但不是必需的。

Redux 有很好的文檔渐裂,還有配套的小視頻(前30集豺旬,后30集)。你可以先閱讀本文柒凉,再去官方材料詳細(xì)研究族阅。

我的目標(biāo)是,提供一個(gè)簡潔易懂的膝捞、全面的入門級參考文檔坦刀。

二、設(shè)計(jì)思想


(1)Web 應(yīng)用是一個(gè)狀態(tài)機(jī)蔬咬,視圖與狀態(tài)是一一對應(yīng)的鲤遥。

(2)所有的狀態(tài),保存在一個(gè)對象里面计盒。

三渴频、基本概念和 API


3.1 Store

Store 就是保存數(shù)據(jù)的地方芽丹,你可以把它看成一個(gè)容器北启。整個(gè)應(yīng)用只能有一個(gè) Store。

Redux 提供createStore這個(gè)函數(shù)拔第,用來生成 Store咕村。

import {createStore} from'redux';

const store=createStore(fn);

上面代碼中,createStore函數(shù)接受另一個(gè)函數(shù)作為參數(shù)蚊俺,返回新生成的 Store 對象懈涛。

3.2 State

Store對象包含所有數(shù)據(jù)。如果想得到某個(gè)時(shí)點(diǎn)的數(shù)據(jù)泳猬,就要對 Store 生成快照批钠。這種時(shí)點(diǎn)的數(shù)據(jù)集合,就叫做 State得封。

當(dāng)前時(shí)刻的 State埋心,可以通過store.getState()拿到。

import{createStore} from'redux';

const store=createStore( fn );

const state=store.getState();

Redux 規(guī)定忙上, 一個(gè) State 對應(yīng)一個(gè) View拷呆。只要 State 相同,View 就相同。你知道 State茬斧,就知道 View 是什么樣腰懂,反之亦然。

3.3 Action

State 的變化项秉,會導(dǎo)致 View 的變化绣溜。但是,用戶接觸不到 State娄蔼,只能接觸到 View涮毫。所以,State 的變化必須是 View 導(dǎo)致的贷屎。Action 就是 View 發(fā)出的通知罢防,表示 State 應(yīng)該要發(fā)生變化了。

Action 是一個(gè)對象唉侄。其中的type屬性是必須的咒吐,表示 Action 的名稱。其他屬性可以自由設(shè)置属划,社區(qū)有一個(gè)規(guī)范可以參考恬叹。

const action={type:'ADD_TODO',payload:'Learn Redux'};

上面代碼中,Action 的名稱是ADD_TODO同眯,它攜帶的信息是字符串Learn Redux绽昼。

可以這樣理解,Action 描述當(dāng)前發(fā)生的事情须蜗。改變 State 的唯一辦法硅确,就是使用 Action。它會運(yùn)送數(shù)據(jù)到 Store明肮。


3.4 Action Creator

View 要發(fā)送多少種消息菱农,就會有多少種 Action。如果都手寫柿估,會很麻煩循未。可以定義一個(gè)函數(shù)來生成 Action秫舌,這個(gè)函數(shù)就叫 Action Creator的妖。

const ADD_TODO='添加 TODO';

functionaddTodo(text){

return{

? ? ? ? ? type:ADD_TODO,

? ? ? ? ? text

? ? ? }

}

const action=addTodo('Learn Redux');

上面代碼中,addTodo函數(shù)就是一個(gè) Action Creator足陨。

3.5 store.dispatch()

store.dispatch()是 View 發(fā)出 Action 的唯一方法嫂粟。

import{createStore}from'redux';

const store=createStore(fn);

store.dispatch({

? ? ? type:'ADD_TODO',

? ? ? payload:'Learn Redux'

});

上面代碼中,store.dispatch接受一個(gè) Action 對象作為參數(shù)钠右,將它發(fā)送出去赋元。

結(jié)合 Action Creator,這段代碼可以改寫如下。

store.dispatch(addTodo('Learn Redux'));

3.6 Reducer

Store 收到 Action 以后搁凸,必須給出一個(gè)新的 State媚值,這樣 View 才會發(fā)生變化。這種 State 的計(jì)算過程就叫做 Reducer护糖。

Reducer 是一個(gè)函數(shù)褥芒,它接受 Action 和當(dāng)前 State 作為參數(shù),返回一個(gè)新的 State嫡良。

const reducer=function(state,action){

? ? ?returnnew_state;

};

整個(gè)應(yīng)用的初始狀態(tài)锰扶,可以作為 State 的默認(rèn)值。下面是一個(gè)實(shí)際的例子寝受。

const defaultState=0;

const reducer=(state=defaultState,action)=>{

? ? ? ? ?switch(action.type){

? ? ? ? ? ? ? ? ? case'ADD':returnstate+action.payload;

? ? ? ? ? ? ? ? ? ?default:returnstate;

? ? ? ? ?}

};

const state=reducer(1,{

? ? ? ? ?type:'ADD',

? ? ? ? payload:2

});

上面代碼中坷牛,reducer函數(shù)收到名為ADD的 Action 以后,就返回一個(gè)新的 State很澄,作為加法的計(jì)算結(jié)果京闰。其他運(yùn)算的邏輯(比如減法),也可以根據(jù) Action 的不同來實(shí)現(xiàn)甩苛。

實(shí)際應(yīng)用中蹂楣,Reducer 函數(shù)不用像上面這樣手動調(diào)用,store.dispatch方法會觸發(fā) Reducer 的自動執(zhí)行讯蒲。為此痊土,Store 需要知道 Reducer 函數(shù),做法就是在生成 Store 的時(shí)候墨林,將 Reducer 傳入createStore方法赁酝。

import{createStore}from'redux';

const store=createStore(reducer);

上面代碼中,createStore接受 Reducer 作為參數(shù)萌丈,生成一個(gè)新的 Store赞哗。以后每當(dāng)store.dispatch發(fā)送過來一個(gè)新的 Action,就會自動調(diào)用 Reducer辆雾,得到新的 State。

為什么這個(gè)函數(shù)叫做 Reducer 呢月劈?因?yàn)樗梢宰鳛閿?shù)組的reduce方法的參數(shù)度迂。請看下面的例子,一系列 Action 對象按照順序作為一個(gè)數(shù)組猜揪。

const actions=[

{type:'ADD',payload:0},

{type:'ADD',payload:1},

{type:'ADD',payload:2}

];

const total=actions.reduce(reducer,0);// 3

上面代碼中惭墓,數(shù)組actions表示依次有三個(gè) Action,分別是加0而姐、加1和加2腊凶。數(shù)組的reduce方法接受 Reducer 函數(shù)作為參數(shù),就可以直接得到最終的狀態(tài)3。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钧萍,一起剝皮案震驚了整個(gè)濱河市褐缠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌风瘦,老刑警劉巖队魏,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異万搔,居然都是意外死亡胡桨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門瞬雹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昧谊,“玉大人,你說我怎么就攤上這事∨眨” “怎么了遵岩?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長馅巷。 經(jīng)常有香客問我,道長草姻,這世上最難降的妖魔是什么钓猬? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮撩独,結(jié)果婚禮上敞曹,老公的妹妹穿的比我還像新娘。我一直安慰自己综膀,他們只是感情好澳迫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剧劝,像睡著了一般橄登。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讥此,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天拢锹,我揣著相機(jī)與錄音,去河邊找鬼萄喳。 笑死卒稳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的他巨。 我是一名探鬼主播充坑,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼减江,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捻爷?” 一聲冷哼從身側(cè)響起辈灼,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎役衡,沒想到半個(gè)月后茵休,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡手蝎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年榕莺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棵介。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钉鸯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邮辽,到底是詐尸還是另有隱情唠雕,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布吨述,位于F島的核電站岩睁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏揣云。R本人自食惡果不足惜捕儒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邓夕。 院中可真熱鬧刘莹,春花似錦、人聲如沸焚刚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矿咕。三九已至抢肛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痴腌,已是汗流浹背雌团。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留士聪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓猛蔽,卻偏偏與公主長得像剥悟,于是被迫代替她去往敵國和親灵寺。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

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

  • Redux由Flux演變而來,提供幾個(gè)簡單的API來實(shí)現(xiàn)狀態(tài)管理慈缔,所謂狀態(tài)指的是應(yīng)用數(shù)據(jù)叮称,所以,Redux本質(zhì)上是...
    齊修_qixiuss閱讀 5,613評論 2 19
  • 一藐鹤、什么情況需要redux瓤檐? 1、用戶的使用方式復(fù)雜 2娱节、不同身份的用戶有不同的使用方式(比如普通用戶和管...
    初晨的筆記閱讀 2,030評論 0 11
  • Redux核心概念 設(shè)計(jì)思想 (1) Web 應(yīng)用是一個(gè)狀態(tài)機(jī)挠蛉,視圖與狀態(tài)是一一對應(yīng)的(2) 所有的狀態(tài)都保存在一...
    Allan要做活神仙閱讀 318評論 0 0
  • 學(xué)習(xí)必備要點(diǎn): 首先弄明白,Redux在使用React開發(fā)應(yīng)用時(shí)肄满,起到什么作用——狀態(tài)集中管理 弄清楚Redux是...
    賀賀v5閱讀 8,902評論 10 58
  • http://gaearon.github.io/redux/index.html 谴古,文檔在 http://rac...
    jacobbubu閱讀 79,964評論 35 198