国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

redux淺析

galois / 1880人閱讀

摘要:概念是一個狀態(tài)管理容器使用可以更好的管理和監(jiān)測組件之間需要通信的數(shù)據(jù)。參考源碼參考鏈接

redux概念

redux是一個狀態(tài)管理容器,使用redux可以更好的管理和監(jiān)測組件之間需要通信的數(shù)據(jù)。

redux基本原則 單一數(shù)據(jù)源

在redux中,整個應(yīng)用保持一個數(shù)據(jù)源,數(shù)據(jù)源是一個樹形的結(jié)構(gòu)

狀態(tài)只讀

狀態(tài)只讀意思是不能直接修改,需要通過dispatch action方式才可以,返回的是一個新的狀態(tài)對象

純函數(shù)操作改變數(shù)據(jù)

改變數(shù)據(jù)的純函數(shù)是指reducer,如下形式

reducer(state, action)

函數(shù)內(nèi)部通常是switch case這些代碼,函數(shù)的結(jié)果完全由兩個參決定,同樣的輸入條件,會產(chǎn)生同樣的輸出結(jié)果

redux使用
//reducer.js
export default (state = 0, action) => {
  switch (action.type) {
    case "INCREMENT":
      return state + 1
    case "DECREMENT":
      return state - 1
    default:
      return state
  }
}
//main.js
import { createStore } from "redux"
const store = createStore(counter)
store.getState()  //獲取狀態(tài)
store.dispatch({ type: "INCREMENT" })  //改變狀態(tài)

說明 上面是純redux的一個簡單示例, 目的是改變store內(nèi)部計數(shù)器的狀態(tài)
結(jié)合react使用例子,可以參考我之前的分析

redux分析

redux的核心非常簡潔, 提供了中間件機(jī)制可以拓展功能。核心模塊主要有以下幾部分

  createStore,
  combineReducers,
  bindActionCreators,
  applyMiddleware,
  compose
下面依次來分析,首先是createStore模塊,主要實現(xiàn)邏輯如下
export default function (reducer, preloadedState) {
    let currentState = preloadedState;
    let listeners = [];
    function getState() {
        return currentState
    }
    //派發(fā)action
    function dispatch(action) {
        //通過舊狀態(tài)和新action計算出新狀態(tài)
        currentState = reducer(currentState, action);
        //執(zhí)行監(jiān)聽函數(shù)
        listeners.forEach(listener => listener());
    }
    //派發(fā)了一個動作進(jìn)行初始化
    dispatch({ type: "@@redux/INIT" });
    //供外界訂閱本倉庫中狀態(tài)的變化 
    function subscribe(listener) {
        listeners.push(listener);
        //返回一個取消訂閱函數(shù)
        return function () {
            listeners = listeners.filter(item => item != listener)
        }
    }
    return {
        getState, dispatch, subscribe
    }
}

說明 這個模塊主要通過閉包的方式創(chuàng)建一個store,封裝了處理邏輯,對外只提供getState(獲取狀態(tài)),dispatch(派發(fā)action),subscribe(訂閱改變)三個接口。

combineReducers主要實現(xiàn)邏輯如下
export default function combineReducers(reducers) {
    const finalReducerKeys = Object.keys(reducers)
    //返回的是合并后的reducer
    return function combination(state = {}, action) {
        let hasChanged = false
        const nextState = {}
        for (let i = 0; i < finalReducerKeys.length; i++) {
          const key = finalReducerKeys[i]
          const reducer = finalReducers[key]
          const previousStateForKey = state[key]
          //計算子store中,state的值
          const nextStateForKey = reducer(previousStateForKey, action)
        
          nextState[key] = nextStateForKey
          //如果沒改變的話,還是用之前的state
          hasChanged = hasChanged || nextStateForKey !== previousStateForKey
        }
        return hasChanged ? nextState : state
      }
    }
    

說明 源碼有快200行了,考慮了各種邊界情況,核心邏輯就上面一點, 和并多個reducer成一個對象

bindActionCreators主要實現(xiàn)邏輯如下
export default function bindActionCreators(actionCreators, dispatch) {
  const keys = Object.keys(actionCreators)
  const boundActionCreators = {}
  for (let i = 0; i < keys.length; i++) {
    const key = keys[i]
    const actionCreator = actionCreators[key]
    //把一個 value 為不同 action creator 的對象,轉(zhuǎn)成擁有同名 key 的對象
    if (typeof actionCreator === "function") {
    //使用 dispatch 包裝 action creator 以便子組件可以直接調(diào)用。
      boundActionCreators[key] = function() { return dispatch(actionCreator.apply(this, arguments)) }
    }
  }
  return boundActionCreators
}

說明 惟一會使用到 bindActionCreators 的場景是把 action creator 往下傳到一個組件上,卻不想讓這個組件覺察到 Redux 的存在,而且不希望把 dispatch 或 Redux store 傳給它。

applyMiddleware
export default function applyMiddleware(...middlewares) {
    //下面這句話在create.js中 enhancer(createStore)(reducer, preloadedState)時會執(zhí)行,目的是創(chuàng)建一個增強(qiáng)版的store
  return (createStore) => (...args) => {
    //還是調(diào)用原生createStore邏輯進(jìn)行初始化創(chuàng)建store
    const store = createStore(...args)
    let dispatch = store.dispatch
    let chain = []
    // 傳遞給中間件使用
    const middlewareAPI = {
      getState: store.getState,
      dispatch: (...args) => dispatch(...args)
    }
    //加工中間件,注入middlewareAPI
    chain = middlewares.map(middleware => middleware(middlewareAPI))
    //形成洋蔥中間件形式包裹dispatch結(jié)構(gòu)的形式
    dispatch = compose(...chain)(store.dispatch)

    return {
      ...store,
      dispatch
    }
  }
}

說明 applyMiddleware中間件機(jī)制,可以在處理store前后加一些通用處理,實現(xiàn)這個機(jī)制功能最重要,也是最難理解的一步操作就是compose,見下面分析。

compose
export default function compose(...funcs) {
  
  return funcs.reduce((a, b) => (...args) => a(b(...args)))
}

說明 將多個函數(shù)合并成一個函數(shù),嵌套執(zhí)行,舉個例子,例如compose(f, g, h)后就變成f(g(h())),而 函數(shù)的執(zhí)行順序從右到左,h() g() f()

總結(jié)

為了方便理解,我主要將源碼中關(guān)鍵主流程邏輯做了摘要簡化輸出,加以注釋說明,額外想說的一點感想就是,在redux生態(tài)體系中用到了大量函數(shù)式編程中的一些東西,例如高階函數(shù),以及隨時間不斷增長的action動作列表(可以等價思考認(rèn)為redux對這個列表進(jìn)行reduce操作),而處理action的就是純函數(shù)理念的reducer,還有處理異步的中間件thunk函數(shù)等等。

參考源碼
"redux": "3.7.2",
參考鏈接
https://redux.js.org/

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/94556.html

相關(guān)文章

  • 淺析Redux數(shù)據(jù)流

    摘要:原文地址數(shù)據(jù)流通過這張流程圖,我們可以更好的理解和直接數(shù)據(jù)如何流通,關(guān)系如何映射。函數(shù)只是一個純函數(shù),它接收應(yīng)用程序的當(dāng)前狀態(tài)以及發(fā)生的,然后返回修改后的新狀態(tài)或者有人稱之為歸并后的狀態(tài)。的更新意味著更新。 原文地址:https://github.com/YutHelloWo... showImg(https://segmentfault.com/img/bVRQRK?w=1205&h...

    chaosx110 評論0 收藏0
  • 淺析`redux-thunk`中間件源碼

    摘要:大多的初學(xué)者都會使用中間件來處理異步請求,其理解簡單使用方便具體使用可參考官方文檔。源碼的源碼非常簡潔,出去空格一共只有行,這行中如果不算上則只有行。官方文檔中的一節(jié)講解的非常好,也確實幫我理解了中間件的工作原理,非常推薦閱讀。 總覺得文章也應(yīng)該是有生命力的,歡迎關(guān)注我的Github上的博客,這里的文章會依據(jù)我本人的見識,逐步更新。 大多redux的初學(xué)者都會使用redux-thunk...

    wing324 評論0 收藏0
  • 淺析Redux源碼

    摘要:用法源碼由在年創(chuàng)建的科技術(shù)語。我們除去源碼校驗函數(shù)部分,從最終返回的大的來看。這個返回值無法被識別。洋蔥模型我們來看源碼源碼每個都以作為參數(shù)進(jìn)行注入,返回一個新的鏈。改變原始組數(shù),是一種副作用。 @(Redux)[|用法|源碼] Redux 由Dan Abramov在2015年創(chuàng)建的科技術(shù)語。是受2014年Facebook的Flux架構(gòu)以及函數(shù)式編程語言Elm啟發(fā)。很快,Redux因其...

    lifesimple 評論0 收藏0
  • 前端進(jìn)階資源整理

    摘要:前端進(jìn)階進(jìn)階構(gòu)建項目一配置最佳實踐狀態(tài)管理之痛點分析與改良開發(fā)中所謂狀態(tài)淺析從時間旅行的烏托邦,看狀態(tài)管理的設(shè)計誤區(qū)使用更好地處理數(shù)據(jù)愛彼迎房源詳情頁中的性能優(yōu)化從零開始,在中構(gòu)建時間旅行式調(diào)試用輕松管理復(fù)雜狀態(tài)如何把業(yè)務(wù)邏輯這個故事講好和 前端進(jìn)階 webpack webpack進(jìn)階構(gòu)建項目(一) Webpack 4 配置最佳實踐 react Redux狀態(tài)管理之痛點、分析與...

    BlackMass 評論0 收藏0
  • react路由淺析

    摘要:瀏覽器端使用的和集成使用時會用到中路由分類基于提供的和事件來保持和的同步。路由剖析在上面的示例中是轉(zhuǎn)發(fā)的樞紐在這個中轉(zhuǎn)站有很多線路通過開關(guān)可以啟動列車的運行乘坐列車就可以發(fā)現(xiàn)新大陸。 引言 在使用react做復(fù)雜的spa開發(fā)中,開發(fā)中必不可少的就是react-router,它使用Lerna管理多個倉庫, 在browser端常使用的幾個如下所示 react-router 提供了路由的...

    jackzou 評論0 收藏0

發(fā)表評論

0條評論

galois

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<