摘要:當(dāng)某個無狀態(tài)組件要在某個階段執(zhí)行這些鉤子,它會優(yōu)先執(zhí)行清理函數(shù)再執(zhí)行初始函數(shù)。并且發(fā)現(xiàn)的函數(shù)會在最后才執(zhí)行,它會晚于包含它的父函數(shù)。當(dāng)目前還是實(shí)驗(yàn)性質(zhì),不排除會改變。不好用,不像那么明顯可以與有狀態(tài)組件的生命周期鉤子相對應(yīng)。
React Hook讓無狀態(tài)組件擁有了許多只有有狀態(tài)組件的能力,如自更新能力(setState,使用useState),訪問ref(使用useRef或useImperativeMethods),訪問context(使用useContext),使用更高級的setState設(shè)置(useReducer),及進(jìn)行類似生命周期的階段性方法(useEffect或useLayoutEffect)。
當(dāng)然還有一些Hook,帶來了一些新功能,如useCallback,這是對事件句柄進(jìn)行緩存,useState的第二個返回值是dispatch,但是每次都是返回新的,使用useCallback,可以讓它使用上次的函數(shù)。在虛擬DOM更新過程中,如果事件句柄相同,那么就不用每次都進(jìn)行removeEventListner與addEventListner。最后就是useMemo,取得上次緩存的數(shù)據(jù),它可以說是useCallback的另一種形式。
useState: setState
useReducer: setState
useRef: ref
useImperativeMethods: ref
useContext: context
useCallback:可以對setState的優(yōu)化
useMemo: useCallback的變形
useLayoutEffect:類似componentDidMount/Update, componentWillUnmount
useEffect: 類似于setState(state, cb)中的cb,總是在整個更新周期的最后才執(zhí)行
從上面的描述來看useEffect的時期是非常晚,可以保證頁面是穩(wěn)定下來再做事情。但是useEffect與useLayoutEffect與有狀態(tài)組件的生命周期鉤子又有一點(diǎn)不一樣。
useEffect(function(){ //dosomething return function(){ //dosomething } }, inputs)
useEffect與useLayoutEffect的第一個參數(shù)是一個函數(shù)(初始函數(shù)),這函數(shù)還會返回另一個清理用的函數(shù)(清理函數(shù),在官方文檔中沒有明確的文字,都注釋使用了clean up的字眼,就姑且這樣叫)。當(dāng)某個無狀態(tài)組件要在某個階段執(zhí)行這些鉤子,它會優(yōu)先執(zhí)行清理函數(shù)再執(zhí)行初始函數(shù)。
初次渲染的界面與日志
如果我們向input輸入內(nèi)容,就會發(fā)現(xiàn)它每次都會先進(jìn)行 useEffect與useLayout的清理函數(shù),再執(zhí)行他們的初始函數(shù)。并且發(fā)現(xiàn)useEffect的函數(shù)會在最后才執(zhí)行,它會晚于包含它的父函數(shù)。我們可以點(diǎn)擊頁面上的h1標(biāo)簽,就可以證明這一點(diǎn)。
點(diǎn)擊h1會不斷遞增數(shù)字,到10時會銷供Example這個無狀態(tài)組件與它的子組件Child。下面是數(shù)字到10時的界面與日志。
在我的迷你React框架中是這樣實(shí)現(xiàn)這兩個鉤子
export function useEffect(create, inputs) { return dispatcher.useEffect(create, inputs, PASSIVE, "passive", "unpassive"); } export function useLayoutEffect(create, inputs) { return dispatcher.useEffect(create, inputs, HOOK, "layout", "unlayout"); } export var dispatcher = { //略... useEffect(create, inputs, EffectTag, createList, destoryList) { let fiber = getCurrentFiber(); let cb = dispatcher.useCallbackOrMemo(create, inputs); if (fiber.effectTag % EffectTag) { fiber.effectTag *= EffectTag; } let updateQueue = fiber.updateQueue; let list = updateQueue[createList] || (updateQueue[createList] = []); updateQueue[destoryList] || (updateQueue[destoryList] = []); list.push(cb); }, //略... };
它們就是執(zhí)行時機(jī)不一樣。
當(dāng)目前React Hook還是實(shí)驗(yàn)性質(zhì),不排除會改變。目前有9種鉤子,其實(shí)之前有十種,useMutationEffect前不久已經(jīng)完蛋了。useMemo與useCallback很相近,但覺得useMemo的使用場合很少,不知它會不會廢掉。useEffect不好用,不像useLayoutEffect那么明顯可以與有狀態(tài)組件的生命周期鉤子相對應(yīng)。useImperativeMethods這個名字起得不好,可能以后也會調(diào)整。當(dāng)然這只是我的看法。
React Hook是一個很棒的設(shè)計(jì),它其實(shí)是將有狀態(tài)組件的更新機(jī)制(setState/forceUpdate)的內(nèi)部實(shí)現(xiàn)進(jìn)行了更廣泛的應(yīng)用。當(dāng)它的API穩(wěn)定下來我會與大家分享它們更深層次的實(shí)現(xiàn)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/100330.html
摘要:在線傳遞給的是而不是,返回值即是想要透傳的數(shù)據(jù)了。所以函數(shù)組件在每次渲染的時候如果有傳遞函數(shù)的話都會重渲染子組件。在學(xué)會使用React Hooks之前,可以先看一下相關(guān)原理學(xué)習(xí)React Hooks 前言 在 React 的世界中,有容器組件和 UI 組件之分,在 React Hooks 出現(xiàn)之前,UI 組件我們可以使用函數(shù),無狀態(tài)組件來展示 UI,而對于容器組件,函數(shù)組件就顯得無能為力,我...
摘要:我們統(tǒng)一把這些操作稱為副作用,或者簡稱為作用。盡可能使用標(biāo)準(zhǔn)的以避免阻塞視覺更新。大多數(shù)情況下,不需要同步地執(zhí)行。返回的對象在組件的整個生命周期內(nèi)保持不變。當(dāng)對象內(nèi)容發(fā)生變化時,并不會通知你。 Hook Hook 是 React 16.8.0 的新增特性。 Hook 使你在非 class 的情況下可以使用更多的 React 特性。Hook 不能在 class 組件中使用。 使用規(guī)則: ...
本篇主要和大家溝通關(guān)于ahooks ,我們可以理解為加深對 React hooks 的了解?! ∥覀兿日f下關(guān)于抽象自定義 hooks。構(gòu)建屬于自己的 React hooks 工具庫?! ∑鋵?shí)我們應(yīng)該培養(yǎng)閱讀學(xué)習(xí)源碼的習(xí)慣,工具庫是一個對源碼閱讀不錯的選擇?! ∽ⅲ罕鞠盗袑?ahooks 的源碼解析是基于v3.3.13?! ‖F(xiàn)在就進(jìn)入主題用ahooks 來封裝 React要注意的時機(jī)? Fun...
摘要:不知道大家有沒有使用過他的作用和中的差不多吧在需要讀取的高度寬度的時候特別需要說到現(xiàn)在基本已經(jīng)講完了除了我將會放在篇中講述相關(guān)文章全面轉(zhuǎn)換攻略一本篇之全面轉(zhuǎn)換攻略二本篇剩余全面轉(zhuǎn)換攻略三全局存儲解決方案 useCallback,useMemo 因?yàn)檫@兩個 api 的作用是一樣的,所以我放在一起講; 語法: function useMemo(factory: () => T, deps:...
想要做到就要有更多的學(xué)習(xí),你知道為什么React不把他們設(shè)為默認(rèn)方法#useEvent是一個剛剛提案的原生Hook,還處于RFC?,F(xiàn)在我們就一起來討論下 RFC:Request for Comments 提案應(yīng)用的還十分廣泛 我們先看看在沒有 useEvent 會出現(xiàn)的情況: functionChat(){ const[text,setText]=useState(''...
閱讀 2901·2021-11-24 09:39
閱讀 4395·2021-10-27 14:19
閱讀 2134·2021-08-12 13:25
閱讀 2389·2019-08-29 17:07
閱讀 1176·2019-08-29 13:44
閱讀 1165·2019-08-26 12:17
閱讀 515·2019-08-23 17:16
閱讀 2109·2019-08-23 16:46