redux中介軟體原理 從一臉懵逼到恍然大悟

2021-09-19 10:50:02 字數 2790 閱讀 9456

前言react已經出來很久了,其生態圈之龐大,一鍋燉不下!各種react-xx,已讓我們不堪重負,github上隨便乙個demo,引入的模組至少都是五指之數+。看著頭疼,嚼之無味……。

在此建議新學者,可以從基礎的核心模組學起,前期不要考慮那些數量繁多的馬仔小弟,邊學邊寫,個人感覺前期核心要學的流程大致如下:

react ——> react + redux + react-redux ——> react + redux + react-redux + react-router ——> react + redux + react-redux + react-router ;
其它的,看情況學習和了解,我也很菜,以上感悟都是針對初學者,希望可以減少他們在學習過程中接觸過多的東西,而影響學習信心和樂趣。

文件react小書(作者從無到有,講述了react的起源,通俗易懂)

note: 第三階段的文件現在開始收費檢視了,不過對於搞前端的人來說不用錢也可以來個親密接觸的(大家自己想辦法)

redux莞式教程(拋開需求講實用性都是耍流氓,作者扮演一位pm給我們上了生動的一課,深入淺出,簡明扼要)

react-router文件(一部中規中矩的翻譯之作)

為什麼會出現中介軟體?

我們知道redux的核心,就是控制和管理所有的資料輸入輸出,因此有了dispatch,由於dispatch是乙個很純的純函式,就是單純的派發action來更改資料,其功能簡單且固定。

假如現在產品經理a某有個需求,要求記錄每次的dispatch記錄,我們怎麼辦呢?最簡單直接的辦法就是在每乙個dispatch的前面加上:

console.log('dispatching', action);

dispatch(action)

假如又來乙個產品b說,我需要記錄每次資料出錯的原因,我們怎麼辦呢?然後我們又需要在對每乙個dispatch做修改

trycatch(err)
如果我們的程式中有很多的dispatch,我們就需要新增很多的重複**,雖然編輯器提供批量替換,但這無疑是產生了很多樣板**。

因為所有的需求都是和dispatch息息相關,所以只要我們把日誌放進dispatch函式裡,不就好了嗎,我們只需要更改dispatch函式,把dispatch進行一層封裝。

大概的封裝就是下面這樣:

let next = store.dispatch

store.dispatch = function dispatchandlog(action)

let next = store.dispatch;

store.dispatch = middleware(store)(next); // 這裡傳入store,是因為中介軟體中有可能會用到getstate獲取資料,比如列印當前使用者等需求}

中介軟體的串聯融合。

中介軟體的功能各不相同,它們都要融入到dispatch中,在派發action的時候,按照順序乙個個的執行,這是乙個費腦經的事情。

假如現在我們有兩個中介軟體 logger和collecterror兩個中介軟體函式,那麼大概的執行順序就是 dispatch——>logger改造——>collecterror改造。這裡我們能看到後面的中介軟體需要接收到前面改造後的dispatch,

在前面,我們是直接修改store.dispatch,現在我們換一種寫法,讓每乙個中介軟體函式,接收乙個dispatch,然後返回乙個改造後的dispatch,來作為下乙個中介軟體函式的next,以此類推,用es6的寫法大概**如下:

const logger = store => next => action => 

const collecterror = store => next => action => catch (err)

}

middlewares = middlewares.slice()

middlewares.reverse()

let dispatch = store.dispatch

middlewares.foreach(middleware =>

dispatch = middleware(store)(dispatch)

) return object.assign({}, store, )}

構造過程:

let next = store.dispatch;

let dispatch1 = logger(store)(next);

// 這時候的console.log('dispatching', action) 是沒有執行的

let dispatch2 = collecterror(store)(dispatch1);

// 這時候的console.log('error!', err) 也是沒有執行的

store.dispatch = dispatch2;

執行過程:

store.dispatch(action); //假如我們程式中派發了某個action

//相當於是下面這樣

dispatch2(action); //此時執行了 console.log('error', err)

//由於collecterror中介軟體中的next是接收的logger返回函式即dispatch1,所以在開始執行

dispatch1(action); //此時執行了 console.log('dispatching', action)

// 這個例子不太合理,因為錯誤報告是先 try 的 next(action),但是正常的流程是如此。

一臉懵逼的Socket http對比

標籤 空格分隔 http tcp 今天整理一下已經懵逼好久的socket,http。想要弄清出他們的區別,首先要弄清一下tcp ip協議。每一抽象層建立在低一層提供的服務上,並且為高一層提供服務,看起來大概是這樣子的每一抽象層建立在低一層提供的服務上,並且為高一層提供服務,看起來大概是這樣子的 這樣...

redux中介軟體原理

應用了如下的中介軟體 a,b,c 整個執行 action 的過程為 a b c dispatch c b a action 最右側的next action 返回的是應用傳入的action 該行為是由redux createstore原始碼中dispatch方法返回值決定的,不過一般都會return ...

Docker基礎 從一臉懵到入門

虛擬化技術是一種計算機資源管理技術,是將計算機的各種實體資源,如伺服器 網路 記憶體及儲存等,予以抽象 轉換後呈現出來。虛擬化技術打破了計算機實體結構間的,不可切割的障礙。使使用者可以比原本的組態更好的方式,來應用這些資源。虛擬化技術主要作用 高效能的物理硬體產能過剩和老的舊的硬體產能過低的重組重用...