日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
跟著官方文檔能學懂Hooks就怪了

回想下你入門Hooks的過程,是不是經(jīng)歷過:

目前成都創(chuàng)新互聯(lián)公司已為上千家的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)絡空間、網(wǎng)站運營、企業(yè)網(wǎng)站設計、東烏珠穆沁網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

  1. 類比ClassComponent的生命周期,學習Hooks的執(zhí)行時機
  2. 慢慢熟練以后,發(fā)現(xiàn)Hooks的執(zhí)行時機和生命周期又有些不同。比如componentWillReceiveProps對應哪個Hooks?
  3. 感到困惑,去搜一些Hooks原理層面的文章閱讀

作為一個API,不該簡簡單單、可可愛愛的照著文檔調(diào)用就行么,Hooks為什么這么難?

React官方也發(fā)現(xiàn)了這個問題,在React要重寫文檔了講到,React要基于Hooks重寫文檔。

本文主要包括2方面內(nèi)容:

  1. 解釋Hooks難學的原因
  2. 給出學習Hooks的建議

React的底層架構

可以用一個公式概括React:

 
 
 
 
  1. const UI = fn(state);

視圖可以看作狀態(tài)經(jīng)過函數(shù)的映射。

用戶與界面的交互,可以看作這個公式的不斷執(zhí)行。

這個公式太精簡了,沒有解釋state(狀態(tài))從哪兒來,我們擴展下:

 
 
 
 
  1. const state = reconcile(update);
  2. const UI = fn(state);
  1. 用戶交互產(chǎn)生update(更新)
  2. update經(jīng)過reconcile步驟計算出當前應用的state
  3. fn將state映射為視圖變化(UI)

我們給fn起個名字:commit:

 
 
 
 
  1. const state = reconcile(update);
  2. const UI = commit(state);

那么update在哪里產(chǎn)生呢?當然來自于用戶交互,比如:點擊事件。

所以React的底層架構可以簡化為三步:

  • 用戶交互產(chǎn)生update
  • state = reconcile(update);
  • UI = commit(state);

了解了底層架構,我們再來看通過類比ClassComponent學習Hooks會帶來的問題。

生命周期函數(shù)的抽象層級

我們已經(jīng)有了完整的驅(qū)動視圖更新的底層架構,開發(fā)者該怎么操作這套架構呢?

可以用計算機的抽象層級來類比:

 
 
 
 
  1. 高層:應用程序
  2. 中層:操作系統(tǒng)
  3. 底層:計算機組成架構

對應React:

 
 
 
 
  1. 高層:應用程序       ClassComponent生命周期
  2. 中層:操作系統(tǒng)       介入架構的API
  3. 底層:計算機組成架構  React底層架構

可以看到,生命周期函數(shù)屬于抽象程度比較高的層次。這么設計也是為了讓開發(fā)者更容易上手React。

設想一個Vue2開發(fā)者要轉(zhuǎn)React技術棧,只需要類比Vue的生命周期來學習React的生命周期就行了。

這一切在Hooks到來前都沒問題,然而......

Hooks的抽象層級

Hooks屬于中等抽象層級。也就是說,Hooks直接介入底層架構的運行流程。

 
 
 
 
  1. 高層:應用程序       
  2. 中層:操作系統(tǒng)       Hooks
  3. 底層:計算機組成架構  React底層架構      

當我們用生命周期函數(shù)來類比Hooks時,其實是用高抽象層級的事物來描述低抽象層級的事物。

動物 --> 哺乳動物 --> 牛 --> 奶牛

對于一個只見過奶牛,再沒見過其他動物的人,你怎么向他解釋哺乳動物是啥?

正是由于抽象層級的不對稱,造成通過生命周期函數(shù)類比學習Hooks會遇到問題。

該怎么學Hooks

既然Hooks屬于中等抽象層,離底層很近,那么更好的學習方式是通過底層向上學習。

祭出我們的三步公式:

  • 用戶交互產(chǎn)生update
  • state = reconcile(update);
  • UI = commit(state);

對照公式,我們來講解幾個常見hook的工作流程:

useState

舉個例子:

 
 
 
 
  1. function App() {
  2.   const [state, updateState] = useState(0);
  3.   return  updateState(state + 1)}>
;
  • }
  •  useState返回值數(shù)組包含:

    1. 保存的state
    2. 改變state的方法updateState

    對照公式,state屬于公式步驟2計算得出的:

    • state = reconcile(update);

    此時視圖還沒有更新。

    • 用戶點擊div觸發(fā)updateState,對應公式步驟1:

    用戶交互產(chǎn)生update

    所以調(diào)用updateState能開啟底層架構的三步運行流程。

    當reconcile計算出state后就會進入第三步:

    • UI = commit(state);

    最終渲染視圖。

    useEffect

    舉個例子:

     
     
     
     
    1. useEffect(doSomething, [xx, yy])

    useEffect的回調(diào)函數(shù)doSomething在第三步執(zhí)行完成后異步調(diào)用:

    • UI = commit(state);

    所以在doSomething函數(shù)內(nèi)部能獲取到完成更新的視圖。

    第二個參數(shù)[xx, yy]作為依賴項,決定了doSomething是否會被調(diào)用。

    useLayout

    Effect不同于useEffect在第三步執(zhí)行完成后異步調(diào)用,useLayoutEffect會在第三步執(zhí)行完UI操作后同步執(zhí)行。

    useRef

    以上例子可以看到,useState與useEffect分別在三步流程的不同步驟被觸發(fā),他們的觸發(fā)時機是確定的。

    那么這三個步驟如何交流呢?通過useRef。

    useState作用于第一、二步,useLayoutEffect作用于第三步,useEffect作用于第三步完成后。

    使用useRef,就能達到在不同步驟間共享引用類型數(shù)據(jù)的目的。

    可以看到,React為底層架構三步工作流程的每一步提供了對應的hook,同時提供了串聯(lián)這三步工作流程的hook。

    開發(fā)者只需要根據(jù)業(yè)務需要,通過基礎Hooks組裝出自定義hook,就能在底層架構運行流程的各個時期運行邏輯。

    自底向上學習是本末倒置么?

    有同學會反駁:之前學React得學生命周期函數(shù)的執(zhí)行時機,現(xiàn)在學Hooks得學底層架構運行流程。難道不是本末倒置,更復雜了么?

    其實不然。我問你幾個問題:

    1. componentWillReceiveProps為什么被標記為unsafe?
    2. getDerivedStateFromProps用過么?
    3. this.setState是同步還是異步的?

    這些和生命周期函數(shù)相關的問題一點都不簡單!很多用了幾年React的前端不一定回答的上。

    作為高層次抽象,生命周期函數(shù)隱藏了太多實現(xiàn)細節(jié)。同時React又太靈活,不像Vue通過模版語言限制了開發(fā)者的操作。

    結果就是:不同React開發(fā)者寫出各種奇奇怪怪的ClassComponent。

    反觀通過底層架構運行流程學習Hooks:

    • 底層架構運行流程就是React的絕對真理,不會隱藏更多抽象
    • Hooks的寫法規(guī)范限制了開發(fā)者的奇葩操作

    這里唯一的問題,就是缺少一份從底層出發(fā)的文檔。這也是官方要重寫文檔的初衷。

    對于熟練使用React的開發(fā)者,在官方新文檔出來前,可以參考React技術揭秘[1](點擊閱讀原文)學習。

    這里再提供些其他視角聊Hooks的文章:

    • 從理念層面:代數(shù)效應與Hooks[2]
    • 從微觀(代碼)層面:所有常見Hooks的源碼實現(xiàn)[3]

    當前名稱:跟著官方文檔能學懂Hooks就怪了
    當前網(wǎng)址:http://m.5511xx.com/article/dhjedjo.html