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