[react-hooks] 利用useReducer實現(xiàn)useState

useState 和 useReducer 是使 FunctionComponent 獲得狀態(tài)的2個hooks函數(shù),我在初期的時候以為它們是2個完全不相干(各自獨立)的兩個函數(shù)實現(xiàn)逸雹,可是在逐步深入了解hooks的過程中我發(fā)現(xiàn)并不是這樣揣非,如果又跟我一樣想法同學記得給該篇文章點個贊??犬金。

官方對 useReducer 的定位

 `useReducer` is usually preferable to `useState` when you have 
complex state logic that involves multiple sub-values. It also lets you optimize 
performance for components that trigger deep updates because you can pass 
`dispatch` down instead of callbacks.

對于一個復雜邏輯且有嵌套的狀態(tài)來說,useReducer能帶來渲染性能的提升缔莲,畢竟一個action是會觸發(fā)兄弟結(jié)點的更新的,這對于用useState來實現(xiàn)是比較繁瑣的

初衷

記得某篇博客還是某面試集的題有表述悬秉,useState本身就是用useReducer實現(xiàn)的,意味著useState是useReducer的一個擴展子集冰蘑,且今天剛好對比了下 types文件和泌,如下

function useState<S>(initialState: S | (()=>S)):
  [S,(value:S | ((prev:S)=>void))=>void]

function useReducer<R extends ReducerWithoutAction<any>, I>(
      reducer: R,
      initializerArg: I,
      initializer: (arg: I) => ReducerStateWithoutAction<R>
): [ReducerStateWithoutAction<R>, DispatchWithoutAction];

從這里我們可以看出來useState用useReducer來實現(xiàn)的可行性

function useState<T>(initialState: T | (() => T)) {
  const initState: T =
    // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
    // @ts-ignore
    typeof initialState === 'function' ? initialState() : initialState;

  const [state, dispatch] = React.useReducer(
    // eslint-disable-next-line no-shadow
    (state: T, action: T | ((prev: T) => T)) => {
      // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
      // @ts-ignore
      return typeof action === 'function' ? action(state) : action;
    },
    initState,
  );

  return [
    state,
    (value: T | ((prev: T) => T)) => {
      if (value !== state) {
        dispatch(value);
      }
    },
  ];
}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市祠肥,隨后出現(xiàn)的幾起案子武氓,更是在濱河造成了極大的恐慌,老刑警劉巖仇箱,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件县恕,死亡現(xiàn)場離奇詭異,居然都是意外死亡剂桥,警方通過查閱死者的電腦和手機忠烛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來权逗,“玉大人美尸,你說我怎么就攤上這事≌遛保” “怎么了师坎?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長堪滨。 經(jīng)常有香客問我屹耐,道長,這世上最難降的妖魔是什么椿猎? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮寿弱,結(jié)果婚禮上犯眠,老公的妹妹穿的比我還像新娘。我一直安慰自己症革,他們只是感情好筐咧,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著噪矛,像睡著了一般量蕊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艇挨,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天残炮,我揣著相機與錄音,去河邊找鬼缩滨。 笑死势就,一個胖子當著我的面吹牛泉瞻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苞冯,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼袖牙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舅锄?” 一聲冷哼從身側(cè)響起鞭达,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎皇忿,沒想到半個月后畴蹭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡禁添,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年撮胧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片老翘。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡芹啥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铺峭,到底是詐尸還是另有隱情墓怀,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布卫键,位于F島的核電站傀履,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏莉炉。R本人自食惡果不足惜钓账,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望絮宁。 院中可真熱鬧梆暮,春花似錦、人聲如沸绍昂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窘游。三九已至唠椭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忍饰,已是汗流浹背贪嫂。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喘批,地道東北人撩荣。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓铣揉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親餐曹。 傳聞我的和親對象是個殘疾皇子逛拱,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 在學會使用React Hooks之前,可以先看一下相關原理學習React Hooks 前言 在 React 的世界...
    DC_er閱讀 9,100評論 1 16
  • REACT與函數(shù)式編程 從發(fā)布最初,react就高舉函數(shù)式編程的大旗饱狂。但最最核心的組件化確是用ES6的偽造類Cla...
    TouchMe丶閱讀 1,210評論 0 2
  • Hooks是 React v16.8 的新特性曹步,可以在不使用類組件的情況下,使用 state 以及其他的React...
    hellomyshadow閱讀 13,449評論 0 5
  • React是現(xiàn)在最流行的前端框架之一休讳,它的輕量化讲婚,組件化,單向數(shù)據(jù)流等特性把前端引入了一個新的高度俊柔,現(xiàn)在它又引入的...
    老鼠AI大米_Java全棧閱讀 5,780評論 0 26
  • 你還在為該使用無狀態(tài)組件(Function)還是有狀態(tài)組件(Class)而煩惱嗎筹麸?——擁有了hooks,你再也不需...
    水落斜陽閱讀 82,331評論 11 100