Redux實現(xiàn)原理解析及應用

1洋幻、為什么要用redux

在React中炭玫,數(shù)據(jù)在組件中是單向流動的脑又,數(shù)據(jù)從一個方向父組件流向子組件(通過props),所以,兩個非父子組件之間通信就相對麻煩泞边,redux的出現(xiàn)就是為了解決state里面的數(shù)據(jù)問題

2该押、Redux設計理念

Redux是將整個應用狀態(tài)存儲到一個地方上稱為store,里面保存著一個狀態(tài)樹store tree,組件可以派發(fā)(dispatch)行為(action)給store,而不是直接通知其他組件,組件內部通過訂閱store中的狀態(tài)state來刷新自己的視圖阵谚。

redux-flow.png

3蚕礼、Redux三大原則

  • 1 唯一數(shù)據(jù)源
  • 2 保持只讀狀態(tài)
  • 3 數(shù)據(jù)改變只能通過純函數(shù)來執(zhí)行

1唯一數(shù)據(jù)源

整個應用的state都被存儲到一個狀態(tài)樹里面,并且這個狀態(tài)樹梢什,只存在于唯一的store中

2保持只讀狀態(tài)

state是只讀的奠蹬,唯一改變state的方法就是觸發(fā)action,action是一個用于描述以發(fā)生時間的普通對象

3數(shù)據(jù)改變只能通過純函數(shù)來執(zhí)行

使用純函數(shù)來執(zhí)行修改嗡午,為了描述action如何改變state的囤躁,你需要編寫reducers

或許你讀到這已經(jīng)不知所云了,沒事這只是讓你了解一些redux到底是干嘛的荔睹,后面或詳細的講解各個部分的作用狸演,并且會講解redux實現(xiàn)原理

4、Redux概念解析

4.1 Store

  • store就是保存數(shù)據(jù)的地方僻他,你可以把它看成一個數(shù)據(jù)宵距,整個應用智能有一個store
  • Redux提供createStore這個函數(shù),用來生成Store
import {createStore} from 'redux'
const store=createStore(fn);

4.2 State

state就是store里面存儲的數(shù)據(jù)吨拗,store里面可以擁有多個state消玄,Redux規(guī)定一個state對應一個View,只要state相同,view就是一樣的丢胚,反過來也是一樣的翩瓜,可以通過store.getState( )獲取

import {createStore} from 'redux'
const store=createStore(fn);
const state=store.getState()

4.3 Action

state的改變會導致View的變化,但是在redux中不能直接操作state也就是說不能使用this.setState來操作携龟,用戶只能接觸到View兔跌。在Redux中提供了一個對象來告訴Store需要改變state。Action是一個對象其中type屬性是必須的峡蟋,表示Action的名稱坟桅,其他的可以根據(jù)需求自由設置。

const action={
  type:'ADD_TODO',
  payload:'redux原理'
}

在上面代碼中蕊蝗,Action的名稱是ADD_TODO仅乓,攜帶的數(shù)據(jù)是字符串‘redux原理’,Action描述當前發(fā)生的事情蓬戚,這是改變state的唯一的方式

4.4 store.dispatch( )

store.dispatch( )是view發(fā)出Action的唯一辦法

store.dispatch({
  type:'ADD_TODO',
  payload:'redux原理'
})

store.dispatch接收一個Action作為參數(shù)夸楣,將它發(fā)送給store通知store來改變state。

4.5 Reducer

Store收到Action以后,必須給出一個新的state豫喧,這樣view才會發(fā)生變化石洗。這種state的計算過程就叫做Reducer。
Reducer是一個純函數(shù)紧显,他接收Action和當前state作為參數(shù)讲衫,返回一個新的state

注意:Reducer必須是一個純函數(shù),也就是說函數(shù)返回的結果必須由參數(shù)state和action決定孵班,而且不產生任何副作用也不能修改state和action對象

const reducer =(state,action)=>{
  switch(action.type){
    case ADD_TODO:
        return newstate;
    default return state
  }
}

5涉兽、Redux源碼

里面的注釋就是我一步一步的分析,有點懶沒有把代碼拆分出來給你們看

let createStore = (reducer) => {
    let state;
    //獲取狀態(tài)對象
    //存放所有的監(jiān)聽函數(shù)
    let listeners = [];
    let getState = () => state;
    //提供一個方法供外部調用派發(fā)action
    let dispath = (action) => {
        //調用管理員reducer得到新的state
        state = reducer(state, action);
        //執(zhí)行所有的監(jiān)聽函數(shù)
        listeners.forEach((l) => l())
    }
    //訂閱狀態(tài)變化事件篙程,當狀態(tài)改變發(fā)生之后執(zhí)行監(jiān)聽函數(shù)
    let subscribe = (listener) => {
        listeners.push(listener);
    }
    dispath();
    return {
        getState,
        dispath,
        subscribe
    }
}
let combineReducers=(renducers)=>{
    //傳入一個renducers管理組花椭,返回的是一個renducer
    return function(state={},action={}){
        let newState={};
        for(var attr in renducers){
            newState[attr]=renducers[attr](state[attr],action)

        }
        return newState;
    }
}
export {createStore,combineReducers};

6、Redux使用案例

html代碼

<div id="counter"></div>
  <button id="addBtn">+</button>
  <button id="minusBtn">-</button>

js代碼

function createStore(reducer) {
    var state;
    var listeners = [];
    var getState = () => state;
    var dispatch = (action) => {
        state = reducer(state, action);
        listeners.forEach(l=>l());
    }
    var subscribe = (listener) => {
        listeners.push(listener);
        return () => {
            listeners = listeners.filter((l) => l != listener)
        }
    }
    dispatch();
    return {
        getState, dispatch, subscribe
    }
}
var reducer = (state = 0, action) => {
    if (!action) return state;
    console.log(action);
    switch (action.type) {
        case 'INCREMENT':
            return state + 1;
        case 'DECREMENT':
            return state - 1;
        default:
            return state;
    }
}
var store = createStore(reducer);
store.subscribe(function () {
    document.querySelector('#counter').innerHTML = store.getState();
});

document.querySelector('#addBtn').addEventListener('click', function () {
    store.dispatch({type: 'INCREMENT'});
});
document.querySelector('#minusBtn').addEventListener('click', function () {
    store.dispatch({type: 'DECREMENT'});
});
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末房午,一起剝皮案震驚了整個濱河市矿辽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌郭厌,老刑警劉巖袋倔,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異折柠,居然都是意外死亡宾娜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門扇售,熙熙樓的掌柜王于貴愁眉苦臉地迎上來前塔,“玉大人,你說我怎么就攤上這事承冰』” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵困乒,是天一觀的道長寂屏。 經(jīng)常有香客問我,道長娜搂,這世上最難降的妖魔是什么迁霎? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮百宇,結果婚禮上考廉,老公的妹妹穿的比我還像新娘。我一直安慰自己携御,他們只是感情好昌粤,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布既绕。 她就那樣靜靜地躺著,像睡著了一般婚苹。 火紅的嫁衣襯著肌膚如雪岸更。 梳的紋絲不亂的頭發(fā)上鸵膏,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天膊升,我揣著相機與錄音,去河邊找鬼谭企。 笑死廓译,一個胖子當著我的面吹牛,可吹牛的內容都是我干的债查。 我是一名探鬼主播非区,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盹廷!你這毒婦竟也來了征绸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤俄占,失蹤者是張志新(化名)和其女友劉穎管怠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缸榄,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡渤弛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甚带。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片她肯。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鹰贵,靈堂內的尸體忽然破棺而出晴氨,到底是詐尸還是另有隱情,我是刑警寧澤碉输,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布瑞筐,位于F島的核電站,受9級特大地震影響腊瑟,放射性物質發(fā)生泄漏聚假。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一闰非、第九天 我趴在偏房一處隱蔽的房頂上張望膘格。 院中可真熱鬧,春花似錦财松、人聲如沸瘪贱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菜秦。三九已至甜害,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間球昨,已是汗流浹背尔店。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留主慰,地道東北人嚣州。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像共螺,于是被迫代替她去往敵國和親该肴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容

  • 學習必備要點: 首先弄明白藐不,Redux在使用React開發(fā)應用時匀哄,起到什么作用——狀態(tài)集中管理 弄清楚Redux是...
    賀賀v5閱讀 8,896評論 10 58
  • 一、什么情況需要redux雏蛮? 1涎嚼、用戶的使用方式復雜 2、不同身份的用戶有不同的使用方式(比如普通用戶和管...
    初晨的筆記閱讀 2,028評論 0 11
  • http://gaearon.github.io/redux/index.html 底扳,文檔在 http://rac...
    jacobbubu閱讀 79,956評論 35 198
  • 前言 本文 有配套視頻铸抑,可以酌情觀看。 文中內容因各人理解不同衷模,可能會有所偏差鹊汛,歡迎朋友們聯(lián)系我討論。 文中所有內...
    珍此良辰閱讀 11,904評論 23 111
  • 看到這篇文章build an image gallery using redux saga阱冶,覺得寫的不錯刁憋,長短也適...
    smartphp閱讀 6,154評論 1 29