什么是redux

什么是Redux ?

“Redux 是 JavaScript 狀態(tài)容器,提供可預(yù)測化的狀態(tài)管理”

Redux 的設(shè)計(jì)思想很簡單,就兩句話:

1.Web 應(yīng)用是一個(gè)狀態(tài)機(jī),視圖與狀態(tài)是一一對應(yīng)的。

2.所有的狀態(tài),保存在一個(gè)對象里面。

redux有三大準(zhǔn)則

1.單一數(shù)據(jù)源

? ?整個(gè)應(yīng)用狀態(tài),都應(yīng)該被存儲(chǔ)在單一store的對象樹中。

2.只讀狀態(tài)

? ?唯一可以修改狀態(tài)的方式,就是發(fā)送(dispatch)一個(gè)動(dòng)作(Action),通俗來講,就是說只有g(shù)etter,沒有setter。

3.使用純函數(shù)去修改狀態(tài),(純函數(shù)是指 不依賴于且不改變它作用域之外的變量狀態(tài)?的函數(shù),也就是說,?純函數(shù)的返回值只由它調(diào)用時(shí)的參數(shù)決定?,它的執(zhí)行不依賴于系統(tǒng)的狀態(tài)(比如:何時(shí)、何處調(diào)用它)

redux的幾個(gè)概念

(1)Action

Action是唯一可以改變狀態(tài)的途徑,服務(wù)器的各種推送、用戶自己做的一些操作,最終都會(huì)轉(zhuǎn)換成一個(gè)個(gè)的Action,而且這些Action會(huì)按順序執(zhí)行,這種簡單化的方法用起來非常的方便。Action 是一個(gè)對象。其中的type屬性是必須的,表示 Action 的名稱:

const action = {

? ? type: 'login',

? ? payload: ...,

? ? ...

};

(2)Store

Store管理著整個(gè)應(yīng)用的狀態(tài),store可以理解為一個(gè)存儲(chǔ)數(shù)據(jù)的倉庫,一個(gè)應(yīng)用就這么一個(gè)倉庫,但本質(zhì)上這個(gè)store是一個(gè)對象。 Redux通過createStore這個(gè)函數(shù),來生成store對象:

import { createStore } from 'redux';

const store = createStore(fn);

Store提供了一個(gè)方法dispatch,這個(gè)就是用來發(fā)送一個(gè)動(dòng)作,去修改Store里面的狀態(tài)

store.dispatch({

? type: 'login',

? payload: '...'

});

然后可以通過getState方法來重新獲得最新的狀態(tài),也就是state。

簡潔介紹 state

state就是當(dāng)前的狀態(tài),那么store和state是什么關(guān)系呢? 我們可以認(rèn)為 store 對象包括所有數(shù)據(jù),如果想得到某個(gè)時(shí)點(diǎn)的數(shù)據(jù),就要對 Store 生成快照。這種時(shí)點(diǎn)的數(shù)據(jù)集合,就叫做 State。?

通過store.getState()我們可以得到某一時(shí)點(diǎn)的 state。

import { createStore } from 'redux';

const store = createStore(fn);

const state = store.getState();

  Redux 規(guī)定, 一個(gè) State 對應(yīng)一個(gè) View。只要 State 相同,View 就相同

簡單的說:getState() 會(huì)返回當(dāng)前的state樹。(當(dāng)前很重要)。 即state是當(dāng)前數(shù)據(jù)的狀態(tài)。?

(3)Reducer

當(dāng)dispatch之后,getState的狀態(tài)發(fā)生了改變,Reducer就是用來修改狀態(tài)的。Reducer 是一個(gè)函數(shù),它接受 Action 和當(dāng)前 State 作為參數(shù),返回一個(gè)新的 State。

const reducer = function (state, action) {

? // ...

? return new_state;

};

借鑒一張圖來形容他們的關(guān)系:



什么時(shí)候需要rudux?

簡單說,如果你的UI層非常簡單,沒有很多互動(dòng),Redux 就是不必要的,用了反而增加復(fù)雜性。

1.用戶的使用方式非常簡單

2.用戶之間沒有協(xié)作

3.不需要與服務(wù)器大量交互,也沒有使用 WebSocket

4.視圖層(View)只從單一來源獲取數(shù)據(jù)

上面這些情況,都不需要使用 Redux。

用戶的使用方式復(fù)雜

1.不同身份的用戶有不同的使用方式(比如普通用戶和管理員)

2.多個(gè)用戶之間可以協(xié)作

3.與服務(wù)器大量交互,或者使用了WebSocket

4.View要從多個(gè)來源獲取數(shù)據(jù)

上面這些情況才是 Redux 的適用場景:多交互、多數(shù)據(jù)源。

從組件角度看,如果你的應(yīng)用有以下場景,可以考慮使用 Redux。

1.某個(gè)組件的狀態(tài),需要共享

2.某個(gè)狀態(tài)需要在任何地方都可以拿到

3.一個(gè)組件需要改變?nèi)譅顟B(tài)

4.一個(gè)組件需要改變另一個(gè)組件的狀態(tài)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容