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