1. 程式人生 > >React 資料流管理架構之 Redux

React 資料流管理架構之 Redux

原文地址

 http://www.alloyteam.com/2015/09/react-redux/

繼 Facebook 提出 Flux 架構來管理 React 資料流後,相關架構開始百花齊放,本文簡單分析 React 中管理資料流的方式,以及對 Redux 進行較為仔細的介紹。

React

" A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES "

在 React 中,UI 以元件的形式來搭建,元件之間可以巢狀組合。另,React 中元件間通訊的資料流是單向的,頂層元件可以通過 props 屬性向下層元件傳遞資料,而下層元件不能向上層元件傳遞資料,兄弟元件之間同樣不能。這樣簡單的單向資料流支撐起了 React 中的資料可控性。

那麼,更全面的元件間通訊形式該怎麼實現呢?

  1. 巢狀元件間,上層元件向下層元件傳遞迴調函式,下層元件觸發回撥來更新上層元件的資料。

  2. 以事件的形式,使用釋出訂閱的方式來通知資料更新。

  3. Flux —- Fackbook 提出的管理 React 資料流的架構。Flux 不像一個框架,更是一種組織程式碼的推薦思想。就像 “引導資料流流向的導流管”。

  4. 其他的 “導流管”。ReFlux,Redux 等。

前兩種形式其實也足夠在小應用中跑起來。但當專案越來越大的時候,管理資料的事件或回撥函式將越來越多,也將越來越不好管理了。 對於後兩種形式,個人經過對比後,可以看出 Redux 對 Flux 架構的一些簡化。如 Redux 限定一個應用中只能有單一的 store,這樣的限定能夠讓應用中資料結果集中化,提高可控性。當然,不僅如此。

Redux

Redux 主要分為三個部分 Action、Reducer、及 Store

Action

在 Redux 中,action 主要用來傳遞操作 State 的資訊,以 Javascript Plain Object 的形式存在,如

1 2 3 4 { type:'ADD_FILM', name:'Mission: Impossible' }

在上面的 Plain Object 中,type 屬性是必要的,除了 type 欄位外,action 物件的結構完全取決於你,建議儘可能簡單。type 一般用來表達處理 state 資料的方式。如上面的 'ADD_FILM' 表達要增加一個電影。而 name 表達了增加這個電影的電影名為 'Mission: Impossible'。那麼,當我們需要表達增加另一部電影時,就需要另外一個action,如

1 2 3 4 { type:'ADD_FILM', name:'Minions' }

上面寫法沒有任何問題,但細想,當我們增加的電影越來越多的時候,那這種直接宣告的 Plain Object 將越來越多,不好組織。實際上,我們可以通過建立函式來生產 action,這類函式統稱為 Action Creator,如

1 2 3 functionaddFilm(name){ return{type:'ADD_FILM',name:name}; }

這樣,通過呼叫 addFilm(name) 就可以得到對應的 Action,非常直接。

Reducer

有了 Action 來傳達需要操作的資訊,那麼就需要有根據這個資訊來做對應操作的方法,這就是 Reducer。 Reducer 一般為簡單的處理函式,通過傳入舊的 state 和指示操作的 action 來更新 state,如

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 functionfilms(state=initialState,action){ switch(action.type){ case'ADD_FILM': // 更新 state 中的 films 欄位 return[{ id:state.films.reduce((maxId,film)=>Math.max(film.id,maxId),-1)+1, name:action.name },...state]; case'DELETE_FILM': returnstate.films.filter(film=> film.id!==action.id ); case'SHOW_ALL_FILM': returnObject.assign({},state,{ visibilityFilter:action.filter }); default: returnstate; }

上面程式碼展示了 Reducer 根據傳入的 action.type 來匹配 case 進行不同的 state 更新。

顯然,當專案中存在越來越多的 action.type 時,上面的 films 函式( Reducer )將變得越來越大,越來越多的 case 將導致程式碼不夠清晰。所以在程式碼組織上,通常會將 Reducer 拆分成一個個小的 reducer,每個 reducer 分別處理 state 中的一部分資料,最終將處理後的資料合併成為整個 state。

在上面的程式碼中,我們可以把 'ADD_FILM' 和 'DELETE_FILM' 歸為操作 state.films 的類,而 'SHOW_ALL_FILM' 為過濾顯示類,所以可以把大的 film Reducer 拆分成 filmReducer 和 filterReducer,如

1 filmReducer

1 2 3 4 5 6 7 8 9 10 11 12 13 14

相關推薦

React 資料管理架構 Redux

原文地址  http://www.alloyteam.com/2015/09/react-redux/ 繼 Facebook 提出 Flux 架構來管理 React 資料流後,相關架構開始百花齊放,本文簡單分析 React 中管理資料流的方式,以及對 Redux 進行較為仔細的介紹。

React-資料詳解

在元件的整個生命週期中,隨著該元件的props或者state發生改變,它的DOM表現也將有相應的改變,一個元件就是一個狀態機,對於特定的輸入,它總會返回一致的輸出。 React為每個元件提供了生命週期鉤子函式去響應不同的時刻——建立時、存在期及銷燬時。 生命週期方法

搭建rtmp直播服務3:java開發ffmpeg實現rtsp轉rtmp並實現ffmpeg命令的介面化管理架構設計及程式碼實現

這一篇將進一步深挖java對ffmepg命令的控制並最終實現服務介面化 通知:由於很多同學反映本章程式碼的命令封裝設計的不是很好,所以對本章程式碼重新進行了實現,新版本推翻了本章原有程式碼內部實現,介面設計更加利於注入自己的實現,並增加可執行原生ffmpeg命令功

react redux 資料狀態管理

   大家都知道redux是可以進行全域性資料的一個狀態的管理,下面就以例項的方式給大家展現一下redux是如何進行資料狀態管理的。 首先我們需要引入redux 的包: 包引入成功之後,我們需要定義其相應的引數: 首先我們來定義reducer檔案,如圖: 然後我們來定

深入淺出React+Redux(三:Flux單向資料,相關程式碼在github flux分支)

前言 通過上章,我們能感覺到僅僅通過prop和state 管理React大型專案,簡直是個巨大,恐怖乃至不可完成的挑戰。因為社群和個人喜愛還是推薦Redux做專案的狀態管理。但是作為單向資料流鼻祖的Flux,也是讀者需要整理下區別的。 (一)前端MVC

React ---- 狀態管理Redux

REDUX: 狀態管理 flux -> |- vuex // vue |- react-redux // react 狀態管理: 應用可以在同一個地方查詢、改變、傳播狀態(簡單來說就是資料的共

reactredux的學習筆記

reac http npm 狀態 flux 比較 ins install sta 主流的數據框架:Flux (單向數據量,比較重大,實用性不強) reFlux redux(簡單 單一狀態樹) mvc model: 數據 view: 顯示 controller: 管理(act

03 Java圖形化界面設計——布局管理FlowLayout(式布局)

顯示效果 窗口 ext 整數 管理 平移 sflow awt 程序代碼 前文講解了JFrame、JPanel,其中已經涉及到了空布局的使用。Java雖然可以以像素為單位對組件進行精確的定位,但是其在不同的系統中將會有一定的顯示差異,使得顯示效果不盡相同,為

linux運維、架構路-git版本管理

nbsp font 同步 class ges 之路 blog git服務器 工作目錄 一、常見版本管理系統 1、SVN 集中式的版本控制系統,只有一個中央數據倉庫,如果中央數據倉庫掛了或者不能訪問,所有的使用者無法使用svn,無法進行提交或者備份文件 2、Gi

基於TCP協議的項目架構Socket傳輸的實現

hand == buffered 可靠的 客戶端請求 utf 信息 color hdf 項目背景    某銀行的影像平臺由於使用時間長,服務器等配置原因,老影像系統滿足不了現在日益增長的數據量的需求,所以急需要升級改造。傳統的影像平臺使用的是Oracle數據庫和簡單的架構

油田採油生產業務建模資料圖實踐(EA使用入門)

  資料流圖(Data Flow Diagram):簡稱DFD,是從資料傳遞、儲存和處理的角度,以圖形方式來表達系統資料相關的邏輯功能、資料在系統內部的邏輯流向和邏輯變換過程,是結構化系統分析方法的主要表達工具,以及用於表示軟體模型的一種圖示方法。   資料流圖強調的是資料流和處理過

Vue元件單向資料

子元件能夠通過自身的props選項獲取父元件上的資料,但是在預設情況下,props是單向繫結的---當父元件資料(屬性)發生變化的時候會傳遞給子元件,引起子元件的變化,但不能反過來並且不允許子元件直接改變父元件的資料,會報錯的。例如: 也就是說當通過一種方法改變父元件資料的時候,子元件與之相

android 架構整合react native框架js混編APP

本篇文章主要總結一下現在APP當中使用的js、webView混編架構和技術。 什麼是 js 混編? js混編簡單說就是使用JavaScript開發APP程式。 android應用使用的是java,Kotlin 、c/c++ 為主的語言開發,ios使用的ob

圖解Redux資料(二)

BLOG ARCHIVE GITHUB RSS 圖解Redux資料流(二) Nov 28, 2016 上一篇文章回答了前兩個問題,而這一篇則回答最後一個問題。 Redux如何使用? 前一篇文章描述了Redux的基本要素,並且梳理了一下Redux的

餓了麼元資料管理實踐

一、背景 大資料挑戰 大資料時代,餓了麼面臨資料管理、資料使用、資料問題等多重挑戰。具體可以參考下圖: 資料問題:多種執行、儲存引擎,分鐘、小時、天級的任務排程,怎樣梳理資料的時間線變化? 資料使用:任務、表、列、指標等資料,如何進行檢索、複用、清理、熱度Top計算? 資料管理:怎樣對錶、列、指

資料圖的銷售管理系統

一.某個企業銷售管理系統的功能為 (1)接受顧客的訂單,檢驗訂單,若庫存有貨,進行供貨處理,即修改庫存,給倉庫開備貨單,並且將訂單留底;若庫存量不足,將訂貨單登入缺貨記錄。 (2)根據缺貨記錄進行缺貨登記,將缺貨通知單發給採貨部門,以便採購。 (3)根據採購部門發來的進貨通知單處理

react思考:元件 元件工廠 元件樹 動態生成/替換節點 資料

元件和元件工廠 1元件是根據傳入的props變數來執行業務邏輯和檢視邏輯, 2元件工廠則是產生了很多個不同的這樣的元件 元件樹和資料流、資料波浪 元件連線起來,就成了一顆元件樹, 資料就在連線起來的元件中從根部流向分支末梢, 資料流是一波一波的,每次樹的根本,store中的

Android媒體開發路一:Camera2採集攝像頭原始資料並手動預覽

Android Camera2採集攝像頭原始資料並手動預覽 最近研究了一下android攝像頭開發相關的技術,也看了Google提供的Camera2Basic呼叫示例,以及網上一部分程式碼,但都是在TextureView等預覽基礎上實現,而我想要做的是在不預覽的情況下,能獲取到攝

前端接收資料實現圖片預覽效果--ajax 請求二進位制 圖片 檔案 XMLHttpRequest 請求並處理二進位制資料 最佳實踐

本文為轉載文章 原文連結:https://www.cnblogs.com/cdemo/p/5225848.html 首先要謝謝這位大神的無私貢獻!解決了我的問題也完美表達了我當時的心路歷程 ajax 請求二進位制流 圖片 檔案 XMLHttpRequest 請求並處理二進位制流資料 之最佳實踐

淺談hdfs架構資料

概述   隨著資料量越來越大,在一個作業系統管轄的範圍內存不下了,那麼就分配到更多的作業系統管理的磁碟中,但是不方便管理和維護,迫切需要一種系統來管理多臺機器上的檔案,這就是分散式檔案管理系統。HDFS只是分散式檔案管理系統中的一種。   HDFS,它是一個檔案系統,用於儲存檔案,通過目錄樹來定位檔案;其