精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Ahooks 中那些控制“時機”的 Hook 都是怎么實現的?

開發 前端
在 Function Component 中,使用 useEffect/useLayoutEffect 完成了 Class Components 生命周期的職責。ahooks 也是基于這兩個封裝了常見的代碼執行時機,使用這些 hook,可以讓我們的代碼更加具有可讀性以及邏輯更加清晰。

本文是深入淺出 ahooks 源碼系列,這個系列的目標主要有以下幾點:

加深對 React hooks 的理解。

學習如何抽象自定義 hooks。構建屬于自己的 React hooks 工具庫。

培養閱讀學習源碼的習慣,工具庫是一個對源碼閱讀不錯的選擇。

注:本系列對 ahooks 的源碼解析是基于 v3.3.13。自己 folk 了一份源碼,主要是對源碼做了一些解讀,可見 詳情[1]。

本文來探索一下 ahooks 是怎么封裝 React 的一些執行“時機”的?

Function Component VS Class Component

學習類似 React 和 Vue 這種框架,對它們生命周期的掌握都是必須的,我們需要清楚的知道我們代碼的執行順序,并且在不同的階段執行不同操作的代碼,比如需要掛載完成之后才去獲取 dom 的值,否則可能會獲取不到相應的值。

Class Component

使用過 React 的 Class Component 的同學,就會知道其組件生命周期會分成三個狀態:

  • Mounting(掛載):已插入真實 DOM
  • Updating(更新):正在被重新渲染
  • Unmounting(卸載):已移出真實 DOM

簡單版如下所示:

圖片

其中每個狀態中還會按順序調用不同的方法,對應的詳細如下(這里不展開說):

圖片

可以通過官方提供這個網站查看詳情[2]

可以看到,會有非常多的生命周期方法,而且在不同的版本,生命周期方法還不同。

Function Component

到了 Function Component ,會發現沒有直接提及生命周期的概念,它是更徹底的狀態驅動,它只有一個狀態,React 負責將狀態渲染到視圖中。

對于 Function Component 來說由狀態到頁面渲染只有三步:

  • 輸入狀態(prop、state)
  • 執行組件的邏輯,并在 ?useEffect/useLayoutEffect 中訂閱副作用
  • 輸出UI(Dom節點)

重點是第二步,React 通過 useEffect/useLayoutEffect 訂閱副作用。Class Component 中的生命周期都可以通過 useEffect/useLayoutEffect 來實現。它們兩個的功能非常相似,我們這里看下 useEffect。

使用 useEffect 相當于告訴 React 組件需要在渲染后執行某些操作,React 將在執行 DOM 更新之后調用它。React 保證了每次運行 useEffect 的時候,DOM 已經更新完畢。這就實現了 Class Component 中的 Mounting(掛載階段)。

當狀態發生變化的時候,它能夠執行對應的邏輯、更行狀態并將結果渲染到視圖中,這就完成了 Class Component 中的 Updating(更新階段)。

最后通過在 useEffect 中返回一個函數,它便可以清理副作用。它的規則是:

  • 首次渲染不會進行清理,會在下一次渲染,清除上一次的副作用。
  • 卸載階段也會執行清除操作。

通過返回一個函數,我們就能實現 Class Component 中的 Unmounting(卸載階段)。

基于 useEffect/useLayoutEffect,ahooks 做了一些封裝,能夠讓你更加清晰的知道你的代碼執行時機。

LifeCycle - 生命周期

useMount

只在組件初始化時執行的 Hook。useEffect 依賴假如為空,只會在組件初始化的時候執行。

// 省略部分代碼
const useMount = (fn: () => void) => {
// 省略部分代碼
// 單純就在 useEffect 基礎上封裝了一層
useEffect(() => {
fn?.();
}, []);
};

export default useMount;

useUnmount

useUnmount,組件卸載(unmount)時執行的 Hook。

useEffect 可以在組件渲染后實現各種不同的副作用。有些副作用可能需要清除,所以需要返回一個函數,這個函數會在組件卸載的時候執行。

const useUnmount = (fn: () => void) => {
const fnRef = useLatest(fn);

useEffect(
// 在組件卸載(unmount)時執行的 Hook。
// useEffect 的返回值中執行函數
() => () => {
fnRef.current();
},
[],
);
};

export default useUnmount;

useUnmountedRef

獲取當前組件是否已經卸載的 Hook。

通過判斷有沒有執行 useEffect 中的返回值判斷當前組件是否已經卸載。

// 獲取當前組件是否已經卸載的 Hook。
const useUnmountedRef = () => {
const unmountedRef = useRef(false);
useEffect(() => {
unmountedRef.current = false;
// 如果已經卸載,則會執行 return 中的邏輯
return () => {
unmountedRef.current = true;
};
}, []);
return unmountedRef;
};

export default useUnmountedRef;

Effect

這里只會講官方文檔 Effect 下面的幾個,有部分是定時器、防抖節流等,咱們后面的系列具體分析。

useUpdateEffect 和 useUpdateLayoutEffect

useUpdateEffect 和 useUpdateLayoutEffect 的用法跟 useEffect 和 useLayoutEffect 一樣,只是會忽略首次執行,只在依賴更新時執行。

實現思路:初始化一個標識符,剛開始為 false。當首次執行完的時候,置為 true。只有標識符為 true 的時候,才執行回調函數。

// 忽略首次執行
export const createUpdateEffect: (hook: effectHookType) => effectHookType =
(hook) => (effect, deps) => {
const isMounted = useRef(false);

// for react-refresh
hook(() => {
return () => {
isMounted.current = false;
};
}, []);

hook(() => {
// 首次執行完時候,設置為 true,從而下次依賴更新的時候可以執行邏輯
if (!isMounted.current) {
isMounted.current = true;
} else {
return effect();
}
}, deps);
};

useDeepCompareEffect和useDeepCompareLayoutEffect

用法與 useEffect 一致,但 deps 通過 lodash isEqual 進行深比較。

通過 useRef 保存上一次的依賴的值,跟當前的依賴對比(使用 lodash 的 isEqual),并將對比結果作為 useEffect 的依賴項,從而決定回調函數是否執行。

const depsEqual = (aDeps: DependencyList, bDeps: DependencyList = []) => {
return isEqual(aDeps, bDeps);
};

const useDeepCompareEffect = (effect: EffectCallback, deps: DependencyList) => {
// 通過 useRef 保存上一次的依賴的值
const ref = useRef<DependencyList>();
const signalRef = useRef<number>(0);

// 判斷最新的依賴和舊的區別
// 如果相等,則變更 signalRef.current,從而觸發 useEffect 中的回調
if (!depsEqual(deps, ref.current)) {
ref.current = deps;
signalRef.current += 1;
}

useEffect(effect, [signalRef.current]);
};

useUpdate

useUpdate 會返回一個函數,調用該函數會強制組件重新渲染。

返回的函數通過變更 useState 返回的 state,從而促使組件進行更新。

import { useCallback, useState } from 'react';

const useUpdate = () => {
const [, setState] = useState({});
// 通過設置一個全新的狀態,促使 function 組件更新
return useCallback(() => setState({}), []);
};

export default useUpdate;

總結與思考

在我們寫代碼的時候需要清晰的知道,組件的生命周期是怎樣的,我們代碼的執行順序、執行的時機是怎樣的。

在 Function Component 中,使用 useEffect/useLayoutEffect 完成了 Class Components 生命周期的職責。ahooks 也是基于這兩個封裝了常見的代碼執行時機,使用這些 hook,可以讓我們的代碼更加具有可讀性以及邏輯更加清晰。

參考資料

[1]詳情: https://github.com/GpingFeng/hooks

[2]詳情: https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/

[3]大家都能看得懂的源碼(一)ahooks 整體架構篇: https://juejin.cn/post/7105396478268407815

[4]如何使用插件化機制優雅的封裝你的請求hook : https://juejin.cn/post/7105733829972721677

[5]ahooks 是怎么解決 React 的閉包問題的?: https://juejin.cn/post/7106061970184339464

[6]ahooks 是怎么解決用戶多次提交問題?: https://juejin.cn/post/7106461530232717326

責任編輯:武曉燕 來源: 前端雜貨鋪
相關推薦

2022-07-01 07:31:18

AhooksDOM場景

2022-04-14 11:50:39

函數組件hook

2014-08-22 13:45:59

2022-06-08 08:01:20

useEffect數組函數

2022-07-06 07:42:14

DOMHook標簽

2020-09-18 15:08:13

5G網絡技術

2022-06-28 07:41:38

useMountReactahooks

2022-07-03 23:26:38

DOMHook封裝

2009-02-09 10:06:03

并發控制Web應用悲觀鎖

2019-10-24 14:15:52

Python工具數據

2022-06-09 09:20:41

ahooksaxios

2024-11-01 16:05:26

2017-07-28 10:11:56

推送APP推送推送輕架構

2023-02-26 08:42:10

源碼demouseEffect

2024-11-05 12:59:42

while 循環迭代字節碼

2010-06-02 09:33:04

2022-02-14 08:04:02

Go語法糖編譯器

2012-07-19 15:30:00

Linux

2022-05-15 08:13:50

Mysql數據庫Mycat

2021-08-11 21:46:47

MySQL索引join
點贊
收藏

51CTO技術棧公眾號

国产女同互慰高潮91漫画| 中文日韩在线| 在线综合+亚洲+欧美中文字幕| 小说区视频区图片区| 亚洲精品久久久久久久久久| 麻豆91精品| 欧美老少配视频| 久久精品老司机| 成人污污视频| 色综合久久综合网欧美综合网| 日本黄色a视频| 三区在线观看| 国产成人综合精品三级| 国产成人精品综合| 在线看成人av| 66视频精品| 亚洲性视频网站| 无码av免费精品一区二区三区| 成人亚洲免费| 欧美午夜影院在线视频| 日韩国产精品毛片| 六十路在线观看| 成人爱爱电影网址| 91精品视频在线免费观看| 亚洲天堂av片| 精品成人在线| 美女视频久久黄| 69xxx免费| 九九在线精品| 亚洲国产精品久久久久久| 国产精品久久久毛片| 天堂av在线网| 亚洲国产一区视频| 激情六月天婷婷| 日日夜夜精品一区| 日本一区二区三区久久久久久久久不 | www.自拍偷拍| 精品久久97| 精品国产一区久久| 日本中文字幕有码| 午夜不卡一区| 在线不卡一区二区| 欧美wwwwwww| 国产69精品久久| 日本高清不卡视频| 国产淫片av片久久久久久| 激情国产在线| 红桃av永久久久| 日韩国产一级片| www555久久| 亚洲一区在线看| 国产 欧美 日本| 蜜桃传媒在线观看免费进入| 亚洲码国产岛国毛片在线| 一级黄色免费在线观看| 黄色网址在线免费| 中文字幕日韩一区| 免费成人深夜夜行网站视频| 国精产品一区| 日韩码欧中文字| 男女爱爱视频网站| 性欧美猛交videos| 亚洲精品乱码久久久久| 日本免费成人网| 国产免费拔擦拔擦8x在线播放 | 国产黄网在线观看| 三级成人在线视频| 国产精品入口尤物| 999久久久久| 粉嫩av一区二区三区在线播放| 国产精品9999久久久久仙踪林| 亚洲精品一区二区口爆| 99久免费精品视频在线观看 | 国产成人av片| 麻豆视频一区| 在线播放国产精品| 久热这里有精品| 99热免费精品在线观看| 国产成人精品视| 亚洲一区二区人妻| 成人中文字幕电影| 久久综合婷婷综合| 亚洲成人三级| 亚洲国产精品天堂| 50路60路老熟妇啪啪| 欧美极品在线| 精品日本一线二线三线不卡| 中文字幕一区二区人妻在线不卡| 菠萝蜜一区二区| 欧美激情第一页xxx| 黄色免费av网站| 麻豆精品一区二区| 国产精品青青草| 日韩国产欧美精品| 午夜精品一区二区三级视频| 少妇精品久久久一区二区| 宅男66日本亚洲欧美视频| 欧美人妻一区二区三区| 欧美在线91| 青青草原成人在线视频| 国产精品天天操| 99re这里只有精品视频首页| 亚洲精品高清国产一线久久| 日本大胆在线观看| 欧洲生活片亚洲生活在线观看| 日本中文字幕在线不卡| 国产欧美日韩在线一区二区| 欧美成人午夜剧场免费观看| 日日夜夜狠狠操| 福利一区在线观看| 亚洲午夜精品一区二区| 成人bbav| 日韩一区二区三区高清免费看看| 中文字幕国产专区| 狠狠噜噜久久| 国产一区二区在线免费视频| 水莓100国产免费av在线播放| 亚洲欧美经典视频| 色婷婷狠狠18| 亚洲人成网亚洲欧洲无码| 久久6精品影院| 夜夜躁狠狠躁日日躁av| 99re视频精品| 精品国产一区二区三区无码| 欧美日韩卡一| 亚洲性猛交xxxxwww| 97免费在线观看视频| 福利一区二区在线| 99精品一区二区三区的区别| 成人午夜一级| 中文字幕在线视频日韩| 中文字幕视频网站| 99久久精品国产导航| 国产乱子伦精品无码专区| 成人在线啊v| 精品国产一区二区三区久久| 日韩欧美一级大片| 国产色婷婷亚洲99精品小说| 五十路熟女丰满大屁股| 中文字幕av一区二区三区四区| 日韩中文av在线| 一级黄色在线观看| 国产日韩av一区二区| 国产精品免费入口| 欧美黑人做爰爽爽爽| 国内外成人免费激情在线视频网站| av资源免费看| 亚洲男人的天堂av| 无码人妻少妇色欲av一区二区| 我不卡影院28| 91亚洲精品久久久| 怡红院av在线| 精品久久人人做人人爽| 国产精品suv一区二区69| 成人动漫在线一区| 国产精品12345| 亚洲国产最新| 国产精品va在线播放| a黄色在线观看| 欧美男女性生活在线直播观看| 男人的午夜天堂| 国产一区二区三区黄视频 | 欧美xxxx黑人又粗又长密月| 二区三区不卡| 中文字幕日韩高清| 国产乱码久久久| 亚洲一区二区欧美激情| 国产成人精品无码片区在线| 免费日韩av片| 在线观看亚洲视频啊啊啊啊| 国产精品亚洲一区二区在线观看| 九九久久久久99精品| 香蕉av一区二区三区| 色婷婷综合久久久久中文| 自拍偷拍你懂的| 国产成人在线视频播放| 日本韩国欧美在线观看| 国产欧美日韩在线观看视频| 成人中文字幕在线观看| 欧美人与动牲性行为| 日韩精品在线免费播放| 在线观看免费观看在线| 亚洲综合网站在线观看| 亚洲精品乱码久久久久久久久久久久| 老司机精品视频导航| 日韩在线观看a| 精品国产精品| 官网99热精品| 欧美暴力调教| 一本色道久久综合精品婷婷| 99精品国产高清一区二区麻豆| 98视频在线噜噜噜国产| 黄色在线网站| 欧美成人综合网站| 亚洲国产成人无码av在线| 一区在线观看视频| 久久人人妻人人人人妻性色av| 奇米影视7777精品一区二区| 800av在线免费观看| av永久不卡| 国产女人水真多18毛片18精品 | 午夜av一区| 久久综合九色综合久99| 麻豆视频久久| 国产精品成人v| 日韩欧美一中文字暮专区| 久久精品亚洲精品| 精彩国产在线| 亚洲二区中文字幕| 国产美女明星三级做爰| 日本道在线观看一区二区| 久久久久无码国产精品| 中国色在线观看另类| av直播在线观看| 国产馆精品极品| 亚洲免费999| 日韩电影在线观看网站| 五十路熟女丰满大屁股| 欧美在线首页| 自拍偷拍99| 日本一区二区高清不卡| 欧美日本韩国一区二区三区| 国产成人aa在线观看网站站| 亚洲自拍欧美色图| 日韩大陆av| 国产精品美乳一区二区免费| 忘忧草在线日韩www影院| 欧美黑人性视频| 最爽无遮挡行房视频在线| 日韩有码在线观看| 成人高清免费观看mv| 亚洲视频电影图片偷拍一区| 午夜视频福利在线观看| 精品国产欧美一区二区| 精品国精品国产自在久不卡| 欧美肥妇毛茸茸| 亚洲一区二区影视| 欧美性猛片aaaaaaa做受| 中文字幕69页| 色婷婷国产精品综合在线观看| 国产亚洲成人精品| 亚洲一区欧美一区| 久久久久久久久久久久久久久久久| 亚洲欧美日韩国产另类专区| 三级黄色在线观看| 综合久久国产九一剧情麻豆| 国产黄a三级三级| 国产精品久久久久久久久图文区| 日韩欧美黄色网址| 国产精品美女久久久久久久久久久 | 久久久久久久亚洲精品| 成人高潮aa毛片免费| 欧美精品成人91久久久久久久| 亚洲电影视频在线| 久久久久国产精品www| 不卡一本毛片| 欧美亚洲成人精品| 国产成人免费9x9x人网站视频| 国产精品成人播放| 成人精品视频在线观看| 国产精品久久波多野结衣| 国产精品一线| 欧洲在线视频一区| 第九色区aⅴ天堂久久香| 在线成人av电影| 狠狠爱综合网| 18禁男女爽爽爽午夜网站免费| 日韩av电影天堂| 91香蕉国产线在线观看| 成人免费看的视频| 国产免费一区二区三区网站免费| 国产精品毛片久久久久久| 欧美激情图片小说| 午夜精品久久久久久不卡8050| 男人天堂2024| 555www色欧美视频| 神马午夜电影一区二区三区在线观看 | 女同激情久久av久久| 成人午夜伦理影院| 欧美熟妇激情一区二区三区| 亚洲色图制服丝袜| 羞羞影院体验区| 欧美日韩国产一级片| 成人黄色免费视频| 亚洲少妇中文在线| 尤物在线网址| 国产精品白丝jk喷水视频一区| 精品国产三区在线| 久久精品magnetxturnbtih| 欧美电影免费观看高清| 成人性免费视频| 六月丁香婷婷色狠狠久久| 日本久久久久久久久久| 国产欧美精品一区二区三区四区| 欧美三级 欧美一级| 91久久精品一区二区| 国产xxxxxx| 在线视频中文亚洲| 国产高清自产拍av在线| 91精品久久久久久久久青青| 日本韩国欧美超级黄在线观看| 中文字幕一区二区三区5566| 香蕉久久夜色精品国产| 日韩成人av免费| 久久久精品免费免费| 精品一级少妇久久久久久久| 欧美在线视频日韩| 五月婷婷六月丁香| 欧美精品做受xxx性少妇| 成人网ww555视频免费看| 国产欧美欧洲| 综合激情一区| 午夜免费看毛片| 国产无人区一区二区三区| 日韩精品久久久久久久| 欧美一区二区三区免费大片| caoporn国产精品免费视频| 91av在线免费观看| 18国产精品| 午夜探花在线观看| 麻豆免费精品视频| 国产又粗又猛又爽视频| 狠狠躁天天躁日日躁欧美| 性中国xxx极品hd| 久久夜色精品亚洲噜噜国产mv| 成人看片在线观看| 欧美午夜精品久久久久久蜜| 亚洲国产专区| 三级视频网站在线观看| 亚洲黄色免费电影| 国产毛片一区二区三区va在线| 中文字幕一区二区三区电影| 性欧美1819sex性高清| 欧美成人dvd在线视频| 国产欧美综合一区二区三区| 亚洲精品第二页| 性久久久久久久| 欧美性受xxxx狂喷水| 国内精品视频一区| 超碰成人97| 无码专区aaaaaa免费视频| 国产91综合一区在线观看| 欧美另类视频在线观看| 日韩一区二区在线看| 午夜dj在线观看高清视频完整版| 91欧美日韩一区| 欧美久久九九| 丰满人妻一区二区三区免费视频棣| 悠悠色在线精品| 丰满人妻妇伦又伦精品国产| 久久久久这里只有精品| 欧美变态网站| 午夜精品久久久内射近拍高清| 久久久久久一二三区| 中文字幕精品视频在线观看| 一区二区三区精品99久久 | av在线不卡一区| 亚洲日韩视频| 亚洲熟妇无码av| 欧美日韩久久一区二区| 成人在线观看亚洲| 春色成人在线视频| 亚洲自拍另类| 国产探花视频在线播放| 91精品黄色片免费大全| 欧美黑人xx片| 欧美日韩一区二区三区在线视频| 日av在线不卡| 久久综合久久鬼| 亚洲欧美国产精品va在线观看| jvid一区二区三区| 日本久久久网站| 国产三级精品视频| 国产人妖在线播放| 91av视频在线播放| 日本a口亚洲| 国产清纯白嫩初高中在线观看性色| 精品福利在线视频| 69xxxx欧美| 国产精品区一区二区三含羞草| 久久精品动漫| 农村妇女精品一区二区| 日韩国产高清污视频在线观看| 欧美日韩在线精品一区二区三区激情综合| 伊人久久大香线蕉av一区| 国产成人免费视频网站高清观看视频| 五月婷婷视频在线| 久久这里只有精品视频首页| 日韩av午夜| 日韩 国产 一区| 韩曰欧美视频免费观看| 免费不卡视频| 久久国产精品一区二区三区| 久久99精品久久久| 黄色片中文字幕| 欧美成人激情图片网| 精品日韩欧美一区| 欧亚乱熟女一区二区在线| 在线播放亚洲一区| 乡村艳史在线观看|