1. 程式人生 > >理解 React,但不理解 Redux,該如何通俗易懂的理解 Redux?

理解 React,但不理解 Redux,該如何通俗易懂的理解 Redux?

解答這個問題並不困難:唯一的要求是你熟悉React。
不要光聽別人描述名詞,理解起來是很困難的。
從需求出發,看看使用React需要什麼:
1. React有props和state: props意味著父級分發下來的屬性,state意味著元件內部可以自行管理的狀態,並且整個React沒有資料向上回溯的能力,也就是說資料只能單向向下分發,或者自行內部消化。
理解這個是理解React和Redux的前提。
2. 一般構建的React元件內部可能是一個完整的應用,它自己工作良好,你可以通過屬性作為API控制它。但是更多的時候發現React根本無法讓兩個元件互相交流,使用對方的資料。
然後這時候不通過DOM溝通(也就是React體制內)解決的唯一辦法就是提升state,將state放到共有的父元件中來管理,再作為props分發回子元件。
3. 子元件改變父元件state的辦法只能是通過onClick觸發父元件宣告好的回撥,也就是父元件提前宣告好函式或方法作為契約描述自己的state將如何變化,再將它同樣作為屬性交給子元件使用。
這樣就出現了一個模式:資料總是單向從頂層向下分發的,但是隻有子元件回撥在概念上可以回到state頂層影響資料。這樣state一定程度上是響應式的。
4. 為了面臨所有可能的擴充套件問題,最容易想到的辦法就是把所有state集中放到所有元件頂層,然後分發給所有元件。
5. 為了有更好的state管理,就需要一個庫來作為更專業的頂層state分發給所有React應用,這就是Redux。讓我們回來看看重現上面結構的需求:
a. 需要回調通知state (等同於回撥引數) -> action
b. 需要根據回撥處理 (等同於父級方法) -> reducer
c. 需要state (等同於總狀態) -> store
對Redux來說只有這三個要素:
a. action是純宣告式的資料結構,只提供事件的所有要素,不提供邏輯。
b. reducer是一個匹配函式,action的傳送是全域性的:所有的reducer都可以捕捉到並匹配與自己相關與否,相關就拿走action中的要素進行邏輯處理,修改store中的狀態,不相關就不對state做處理原樣返回。
c. store負責儲存狀態並可以被react api回撥,釋出action.
當然一般不會直接把兩個庫拿來用,還有一個binding叫react-redux, 提供一個Provider和connect。很多人其實看懂了redux卡在這裡。
a. Provider是一個普通元件,可以作為頂層app的分發點,它只需要store屬性就可以了。它會將state分發給所有被connect的元件,不管它在哪裡,被巢狀多少層。
b. connect是真正的重點,它是一個科裡化函式,意思是先接受兩個引數(資料繫結mapStateToProps和事件繫結mapDispatchToProps),再接受一個引數(將要繫結的元件本身):
mapStateToProps:構建好Redux系統的時候,它會被自動初始化,但是你的React元件並不知道它的存在,因此你需要分揀出你需要的Redux狀態,所以你需要繫結一個函式,它的引數是state,簡單返回你關心的幾個值。
mapDispatchToProps:宣告好的action作為回撥,也可以被注入到元件裡,就是通過這個函式,它的引數是dispatch,通過redux的輔助方法bindActionCreator繫結所有action以及引數的dispatch,就可以作為屬性在元件裡面作為函式簡單使用了,不需要手動dispatch。這個mapDispatchToProps是可選的,如果不傳這個引數redux會簡單把dispatch作為屬性注入給元件,可以手動當做store.dispatch使用。這也是為什麼要科裡化的原因。

相關推薦

理解 React理解 Redux如何通俗易懂理解 Redux

解答這個問題並不困難:唯一的要求是你熟悉React。 不要光聽別人描述名詞,理解起來是很困難的。 從需求出發,看看使用React需要什麼: 1. React有props和state: props意味著父級分發下來的屬性,state意味著元件內部可以自行管理的狀態,並且整個React沒有資料向上回溯的能力,也就

Snipaste - 開發了三年的截圖工具只是截圖

開發 cal 官網 穿透 oba 此外 完全 1.0 頻道 先不要在意標題的“三年”,讓我先介紹一下軟件的功能。 Snipaste ,顧名思義, Snip + Paste ,截圖 + 貼圖。 截圖: 貼圖,即是使圖片成為一個窗口並置頂顯示: 貼圖窗口可以旋轉、縮放

文件操作是一個存為字符串格式的登陸系統有增刪改查的功能是我想要的。。。

str repl 修改 blog 一個 ice body pwd 刪除 def register(NAME, PWD, TEL): with open(‘userdate.txt‘, ‘a‘, encoding=‘utf-8‘) as f: new

Eclipse 無輸出報錯

bug sof app 標簽 clip when ogr pan 解決方法 解決方法: 若界面中都沒有console選項,則 工具欄 Window - Show View - Console Window - Preferences - Run/Debug - Conso

在Python中匯入自己寫的類被劃紅線影響執行

之前在學習Python+selenium的過程中,匯入自己寫的包檔案時,與之相關的方法等都會被劃紅線,但並不影響程式碼執行,如圖:   看著紅線確實有點強迫症,並且在這個過程當時,當使用該檔案裡的方法時不會自動提示方法名,只能靠手全部輸入,這種容易造成手誤,對於小白特別容易降低編寫效

《惢客創業日記》2018.09.18(週二) 我支援你一定看好你。

  今天約了5位朋友吃飯,還好,雖然下著雨,但他們都如約到場,對我來說,實屬難得。他們都是我職業生涯中交往時間較長的朋友,長年在類似國企的環境中工作,沒有什麼超出企業範圍外的野心和抱負,對於網際網路還停留在新聞和馬雲等首富人物的認知上。之所以送書,是因為我們之間的交情,怕他們今後知道我做惢客這件事,

python去除列表中的重複元素能改變原列表

‘’’ 去除列表中的重複元素 1.列表中的元素有重複,需要去掉重複元素 2.要求保留原來的元素順序 3.不需要返回值,直接修改原列表即可 ‘’’ def duplicate_removal(lt): lt1 = [] for i in lt: if i

MySQL 可以用localhost 連線能用IP連線的問題區域網192.168.*.* 無法連線mysql

Mysql 預設是沒有開啟這個許可權的(只允許使用 host:localhost,或者 host:127.0.0.1),如果想用 host:192.168.1.* ,來訪問mysql ,需要手動開啟這個許可權進入Mysql終端輸入這個命令 1.開啟cmd視窗,進入MyS

[winform] 關於如何清空DataGridView刪除標題行

對於標題行需要繫結資料來源的DataGridView,在清空時,若直接使用this.datagridview1.DataSource=null的方式,則會把繫結好的資料來源都清空,只有在下次重新開啟窗體時,才會初始化成繫結資料來源的狀態。 而使用 this.dataGrid

集合差集操作:a - b 的含義為在集合a中在b中的元素集合。

a = set(‘boy’) a Out[8]: {‘b’, ‘o’, ‘y’} b = set(‘girlb’) b Out[10]: {‘b’, ‘g’, ‘i’, ‘l’, ‘r’} c = a - b c Out[12]: {‘o’, ‘y’} 集合(set)是一

jq獲取元素內文字包括其子元素內的文字值的方法包括後代

權宣告:本文為博主原創文章,未經博主允許不得轉載。    https://blog.csdn.net/zhangwenwu2/article/details/78365667 <li id="listItem">     This is some text    

win10安裝JDK cmd中可以執行java能用javac解決方案

win10安裝JDK cmd中可以執行java,但不能用javac 網上教程(1)新建->變數名"JAVA_HOME",變數值"C:\Java\jdk1.8.0_05"(即JDK的安裝路徑) (2)編輯->變數名"Path",在原變數值的最後面加上“;%JAVA_HOME%\bin;%JAVA_

美國網際網路“地震”警察局被打爆電話,直呼:我們能救人能救網啊!

10月17日,YouTube視訊網站出現全球大宕機,而這次宕機事件的影響蔓延到世界各地。即便是需要翻牆才能開啟YouTube視訊網站的國內,這條訊息的熱度也依然衝上了新聞排行榜。 宕機開始於美國東部時間週二晚上9點,當時有使用者開始報告網站出現問題。隨即,Yo

劍指-OFFER_3 java_在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也知道每個數字重複幾次。請找出陣列中任意一個重複的數字。

題源:  在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。   例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字

checkbox已設定checked="checked"顯示打勾的解決方案

一、用js給某個checkbox動態設定checked="checked",沒有打勾,則需要嘗試.prop('checked',true)的寫法,如果該方法無效繼續往下看 二、如果是動態寫的html程式碼段或上一步驟方法無效,那就要檢查checkbox元素是否含有id屬性,

編寫函式找出1-1000之內所有能被7整除或被11整除能同時被7和11整除的數放到A所指的陣列內並返回個數

#include<stdio.h> int f(int a[]) { int i = 0,n; for(n = 1;n <=1000;n++) { if(n%7==0 || n%11==0) //能被7整除或被11整除

【Walden_tinghou的專欄】假如我能使一顆心免於破碎我便沒有白活一場。假如我能消除一個人的痛苦或者平息一個人的悲傷或者幫助一隻昏迷的知更鳥 重新回到它的巢中我便沒有白活一場 ;學無止境!追求細節與極致,但不偏執!

假如我能使一顆心免於破碎,我便沒有白活一場。假如我能消除一個人的痛苦,或者平息一個人的悲傷,或者幫助一隻昏迷的知更鳥 ,重新回到它的巢中,我便沒有白活一場 ;學無止境!追求細節與極致,但不偏執!...

我是網管是網咖管理員!!!

我們都知道,在運維崗位中,網管就是網路管理員、網路運維工程師的簡稱。 我之前在華為工作期間,是負責華為無線OSS系統的運維和運維工具開發,這個系統是管理網元的,比如大家看到一些建築樓頂上的無線基站之類的,所以我們也將其簡稱為“網管系統”。 在給別人介紹說“我在華為是做網管系統運維的”,遇到不少次詫異