useReducer進階

官網(wǎng)地址

第一句話很重要增炭。

An alternative to useState.

表明底層還是useState實現(xiàn),且作為additional的hook我們其實不用他也可以實現(xiàn),那什么場景會需要useReducer呢?

傳送門

如果你熟悉redux的話你會發(fā)現(xiàn)useReducer跟redux很像,上手很容易十酣。

const [state, dispatch] = useReducer(reducer, initialArg, init);</pre>

三個參數(shù)

  1. reducer function reducer是一個利用action提供的信息,將state從A轉(zhuǎn)換到B的一個純函數(shù)

  2. initialArg 初始化的state际长。返回值為最新的state和dispatch函數(shù)(用來觸發(fā)reducer函數(shù)耸采,計算對應(yīng)的state)

  3. init function 非必須 我們在Lazy initialization的時候需要用到。至于什么場景什么情況會用到我們先看官方demo, 我們將官網(wǎng)demo放進codesandbox我們可以直接看出來

codesandbox

It lets you extract the logic for calculating the initial state outside the reducer. This is also handy for resetting the state later in response to an action

當(dāng)我們需要在reducer外部計算init state的時候我們可以把這部分邏輯提取出來工育,這也非常方便當(dāng)你需要在action中重置state

useReducer Concept

可以把UseReducer想象成一個后端虾宇,后端通常需要一個數(shù)據(jù)庫和一些APl來修改你數(shù)據(jù)庫的數(shù)據(jù)。

  • state 就是數(shù)據(jù)庫存儲你的數(shù)據(jù)

  • dispatch相當(dāng)于調(diào)用 API 端點來修改數(shù)據(jù)庫如绸。

  • 你可以指定type表明哪一個API被調(diào)用.

  • 你可以提供額外的數(shù)據(jù)在payload的屬性里, 這就像POST請求的body.

  • typepayload 都是提供給reducer的對象的屬性. 該對象被稱作action.

  • reducer 是 API 的邏輯嘱朽。 它在后端收到 API 調(diào)用(dispatch)時調(diào)用,并根據(jù)端點和請求內(nèi)容(action)處理如何更新數(shù)據(jù)庫.

Why useReducer

先上圖

image

再看看官網(wǎng)解釋

useReducer is usually preferable to useState when you have complex state logic that involves multiple sub-values or when the next state depends on the previous one. useReducer also lets you optimize performance for components that trigger deep updates because you can passdispatchdown instead of callbacks.

  • 復(fù)雜的state邏輯

  • 下個一個state依賴上一個state

  • 需要提升performance

  • 多個state相互依賴 (form表單)

userReducer VS useState

  • init
const [state, setState] = useState(initialValue); // setState for useState

const [state, dispatch] = useReducer(reducer, initialValue); // dispatch for useReducer</pre>
  • change state
// with `useState`
<button onClick={() => setCount(prevCount => prevCount + 1)}>
  +
</button>
// with `useReducer`
<button onClick={() => dispatch({type: 'increment', payload: 1})}>
  +
</button></pre>

Full Demo

我們創(chuàng)建了一個在表單情況下使用useReducer的情況

詳情參照代碼里的注釋

  • JS

demo

  • TS

https://codesandbox.io/s/react-userreducer-form-ts-4ko55u

Preference

https://devtrium.com/posts/how-to-use-react-usereducer-hook#usereducer-a-backend-mental-model

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怔接,一起剝皮案震驚了整個濱河市搪泳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜕提,老刑警劉巖森书,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谎势,居然都是意外死亡,警方通過查閱死者的電腦和手機杨名,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門脏榆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人台谍,你說我怎么就攤上這事须喂。” “怎么了趁蕊?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵坞生,是天一觀的道長。 經(jīng)常有香客問我掷伙,道長是己,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任任柜,我火速辦了婚禮卒废,結(jié)果婚禮上沛厨,老公的妹妹穿的比我還像新娘。我一直安慰自己摔认,他們只是感情好逆皮,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著参袱,像睡著了一般电谣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抹蚀,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天剿牺,我揣著相機與錄音,去河邊找鬼况鸣。 笑死牢贸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镐捧。 我是一名探鬼主播潜索,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼懂酱!你這毒婦竟也來了竹习?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤列牺,失蹤者是張志新(化名)和其女友劉穎整陌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞎领,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡泌辫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了九默。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片震放。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驼修,靈堂內(nèi)的尸體忽然破棺而出殿遂,到底是詐尸還是另有隱情,我是刑警寧澤乙各,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布墨礁,位于F島的核電站,受9級特大地震影響耳峦,放射性物質(zhì)發(fā)生泄漏恩静。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望圾结。 院中可真熱鬧讯柔,春花似錦并级、人聲如沸厢钧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漠秋。三九已至唇牧,卻和暖如春罕扎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丐重。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工腔召, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扮惦。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓臀蛛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親崖蜜。 傳聞我的和親對象是個殘疾皇子浊仆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355