Redux 入門教程

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

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

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

組件之間的通信

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

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

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

一、預(yù)備知識


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

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

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

二、設(shè)計思想


(1)Web 應(yīng)用是一個狀態(tài)機,視圖與狀態(tài)是一一對應(yīng)的。

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

三、基本概念和 API


3.1 Store

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

Redux 提供createStore這個函數(shù),用來生成 Store。

import {createStore} from'redux';

const store=createStore(fn);

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

3.2 State

Store對象包含所有數(shù)據(jù)。如果想得到某個時點的數(shù)據(jù),就要對 Store 生成快照。這種時點的數(shù)據(jù)集合,就叫做 State。

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

import{createStore} from'redux';

const store=createStore( fn );

const state=store.getState();

Redux 規(guī)定, 一個 State 對應(yīng)一個 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 是一個對象。其中的type屬性是必須的,表示 Action 的名稱。其他屬性可以自由設(shè)置,社區(qū)有一個規(guī)范可以參考。

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

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

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


3.4 Action Creator

View 要發(fā)送多少種消息,就會有多少種 Action。如果都手寫,會很麻煩??梢远x一個函數(shù)來生成 Action,這個函數(shù)就叫 Action Creator。

const ADD_TODO='添加 TODO';

functionaddTodo(text){

return{

? ? ? ? ? type:ADD_TODO,

? ? ? ? ? text

? ? ? }

}

const action=addTodo('Learn Redux');

上面代碼中,addTodo函數(shù)就是一個 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接受一個 Action 對象作為參數(shù),將它發(fā)送出去。

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

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

3.6 Reducer

Store 收到 Action 以后,必須給出一個新的 State,這樣 View 才會發(fā)生變化。這種 State 的計算過程就叫做 Reducer。

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

const reducer=function(state,action){

? ? ?returnnew_state;

};

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

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 以后,就返回一個新的 State,作為加法的計算結(jié)果。其他運算的邏輯(比如減法),也可以根據(jù) Action 的不同來實現(xiàn)。

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

import{createStore}from'redux';

const store=createStore(reducer);

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

為什么這個函數(shù)叫做 Reducer 呢?因為它可以作為數(shù)組的reduce方法的參數(shù)。請看下面的例子,一系列 Action 對象按照順序作為一個數(shù)組。

const actions=[

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

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

{type:'ADD',payload:2}

];

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容