useState - React源碼解析(八)

本文將講解useState鉤子的實現(xiàn)捏鱼。useState是基于useReducer實現(xiàn)的衍慎。其reducer函數(shù)為:

function basicStateReducer<S>(state: S, action: BasicStateAction<S>): S {
  // $FlowFixMe: Flow doesn't like mixed types
  return typeof action === 'function' ? action(state) : action;
}

Mount階段

useState的這個階段和useReducer所完成的事情是一樣甥角,只是其reducer為basicStateReducer垦搬,而useReducer是由參數(shù)傳入:

  1. useState首先調(diào)用mountWorkInProgressHook創(chuàng)建一個Hook對象
  2. 然后呼寸,計算初始狀態(tài)值initialState,該值可以是由第二個參數(shù)(當不傳第三個參數(shù)時)傳入猴贰,也可由第三個參數(shù)(只能是函數(shù))和第二個參數(shù)計算所得对雪。
  3. 創(chuàng)建queue以及dispatch函數(shù)
  4. 返回初始值initialState以及dispatch函數(shù)
function mountState<S>(
  initialState: (() => S) | S,
): [S, Dispatch<BasicStateAction<S>>] {
  const hook = mountWorkInProgressHook();
  if (typeof initialState === 'function') {
    // $FlowFixMe: Flow doesn't like mixed types
    initialState = initialState();
  }
  hook.memoizedState = hook.baseState = initialState;
  const queue = (hook.queue = {
    pending: null,
    dispatch: null,
    lastRenderedReducer: basicStateReducer,
    lastRenderedState: (initialState: any),
  });
  const dispatch: Dispatch<
    BasicStateAction<S>,
  > = (queue.dispatch = (dispatchAction.bind(
    null,
    currentlyRenderingFiber,
    queue,
  ): any));
  return [hook.memoizedState, dispatch];
}

Update階段

這個階段是直接調(diào)用的updateReducer,其邏輯大體與updateReducer相同米绕。

function updateState<S>(
  initialState: (() => S) | S,
): [S, Dispatch<BasicStateAction<S>>] {
  return updateReducer(basicStateReducer, (initialState: any));
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瑟捣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子义郑,更是在濱河造成了極大的恐慌蝶柿,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件非驮,死亡現(xiàn)場離奇詭異交汤,居然都是意外死亡,警方通過查閱死者的電腦和手機劫笙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門芙扎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人填大,你說我怎么就攤上這事戒洼。” “怎么了允华?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵圈浇,是天一觀的道長。 經(jīng)常有香客問我靴寂,道長磷蜀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任百炬,我火速辦了婚禮褐隆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剖踊。我一直安慰自己庶弃,他們只是感情好衫贬,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歇攻,像睡著了一般固惯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掉伏,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天缝呕,我揣著相機與錄音,去河邊找鬼斧散。 笑死供常,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鸡捐。 我是一名探鬼主播栈暇,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼箍镜!你這毒婦竟也來了源祈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤色迂,失蹤者是張志新(化名)和其女友劉穎香缺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歇僧,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡图张,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诈悍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祸轮。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖侥钳,靈堂內(nèi)的尸體忽然破棺而出适袜,到底是詐尸還是另有隱情,我是刑警寧澤舷夺,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布苦酱,位于F島的核電站,受9級特大地震影響给猾,放射性物質(zhì)發(fā)生泄漏躏啰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一耙册、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毫捣,春花似錦详拙、人聲如沸帝际。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹲诀。三九已至,卻和暖如春弃揽,著一層夾襖步出監(jiān)牢的瞬間脯爪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工矿微, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痕慢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓涌矢,卻偏偏與公主長得像掖举,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子娜庇,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359