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

Ahooks 是怎么處理 DOM 的?

開發 前端
一個優秀的工具庫應該有自己的一套輸入輸出規范,一來能夠支持更多的場景,二來可以更好的在內部進行封裝處理,三來使用者能夠更加快速熟悉和使用相應的功能,能做到舉一反三。

本篇文章探討一下 ahooks 對 DOM 類 Hooks 使用規范,以及源碼中是如何去做處理的。

DOM 類 Hooks 使用規范

這一章節,大部分參考官方文檔的 DOM 類 Hooks 使用規范[1]。

第一點,ahooks 大部分 DOM 類 Hooks 都會接收 target 參數,表示要處理的元素。

target 支持三種類型 React.MutableRefObject(通過 useRef 保存的 DOM)、HTMLElement、() => HTMLElement(一般運用于 SSR 場景)。

第二點,DOM 類 Hooks 的 target 是支持動態變化的。如下所示:

export default () => {
const [boolean, { toggle }] = useBoolean();

const ref = useRef(null);
const ref2 = useRef(null);

const isHovering = useHover(boolean ? ref : ref2);
return (
<>
<div ref={ref}>{isHovering ? 'hover' : 'leaveHover'}</div>
<div ref={ref2}>{isHovering ? 'hover' : 'leaveHover'}</div>
</>
);
};

那 ahooks 是怎么處理這兩點的呢?

getTargetElement

獲取到對應的 DOM 元素,這一點主要兼容以上第一點的入參規范。

  • 假如是函數,則取執行完后的結果。
  • 假如擁有 current 屬性,則取 current 屬性的值,兼容React.MutableRefObject 類型。
  • 最后就是普通的 DOM 元素。
export function getTargetElement<T extends TargetType>(target: BasicTarget<T>, defaultElement?: T) {
// 省略部分代碼...
let targetElement: TargetValue<T>;

if (isFunction(target)) {
// 支持函數獲取
targetElement = target();
// 假如 ref,則返回 current
} else if ('current' in target) {
targetElement = target.current;
// 支持 DOM
} else {
targetElement = target;
}

return targetElement;
}

useEffectWithTarget

這個方法,主要是為了支持第二點,支持 target 動態變化。

其中 packages/hooks/src/utils/useEffectWithTarget.ts 是使用 useEffect。

import { useEffect } from 'react';
import createEffectWithTarget from './createEffectWithTarget';

const useEffectWithTarget = createEffectWithTarget(useEffect);

export default useEffectWithTarget;

另外 其中 packages/hooks/src/utils/useLayoutEffectWithTarget.ts 是使用 useLayoutEffect。

import { useLayoutEffect } from 'react';
import createEffectWithTarget from './createEffectWithTarget';

const useEffectWithTarget = createEffectWithTarget(useLayoutEffect);

export default useEffectWithTarget;

兩者都是調用的 createEffectWithTarget,只是入參不同。

直接重點看這個 createEffectWithTarget 函數:

  • createEffectWithTarget 返回的函數useEffectWithTarget接受三個參數,前兩個跟 useEffect 一樣,第三個就是 target。
  • useEffectType 就是 useEffect 或者 useLayoutEffect。注意這里調用的時候,沒傳第二個參數,也就是每次都會執行。
  • hasInitRef 判斷是否已經初始化。lastElementRef 記錄的是最后一次 target 元素的列表。lastDepsRef 記錄的是最后一次的依賴。unLoadRef 是執行完 effect 函數(對應的就是 useEffect 中的 effect 函數)的返回值,在組件卸載的時候執行。
  • 第一次執行的時候,執行相應的邏輯,并記錄下最后一次執行的相應的 target 元素以及依賴。
  • 后面每次執行的時候,都判斷目標元素或者依賴是否發生變化,發生變化,則執行對應的 effect 函數。并更新最后一次執行的依賴。
  • 組件卸載的時候,執行 unLoadRef.current?.() 函數,并重置 hasInitRef 為 false。
const createEffectWithTarget = (useEffectType: typeof useEffect | typeof useLayoutEffect) => {
/**
* @param effect
* @param deps
* @param target target should compare ref.current vs ref.current, dom vs dom, ()=>dom vs ()=>dom
*/
const useEffectWithTarget = (
effect: EffectCallback,
deps: DependencyList,
target: BasicTarget<any> | BasicTarget<any>[],
) => {
const hasInitRef = useRef(false);

const lastElementRef = useRef<(Element | null)[]>([]);
const lastDepsRef = useRef<DependencyList>([]);

const unLoadRef = useRef<any>();

// useEffect 或者 useLayoutEffect
useEffectType(() => {
// 處理 DOM 目標元素
const targets = Array.isArray(target) ? target : [target];
const els = targets.map((item) => getTargetElement(item));

// init run
// 首次初始化的時候執行
if (!hasInitRef.current) {
hasInitRef.current = true;
lastElementRef.current = els;
lastDepsRef.current = deps;
// 執行回調中的 effect 函數
unLoadRef.current = effect();
return;
}
// 非首次執行的邏輯
if (
// 目標元素或者依賴發生變化
els.length !== lastElementRef.current.length ||
!depsAreSame(els, lastElementRef.current) ||
!depsAreSame(deps, lastDepsRef.current)
) {
// 執行上次返回的結果
unLoadRef.current?.();

// 更新
lastElementRef.current = els;
lastDepsRef.current = deps;
unLoadRef.current = effect();
}
});

useUnmount(() => {
// 卸載
unLoadRef.current?.();
// for react-refresh
hasInitRef.current = false;
});
};

return useEffectWithTarget;
};

思考與總結

一個優秀的工具庫應該有自己的一套輸入輸出規范,一來能夠支持更多的場景,二來可以更好的在內部進行封裝處理,三來使用者能夠更加快速熟悉和使用相應的功能,能做到舉一反三。

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

2022-06-08 08:01:20

useEffect數組函數

2022-06-09 09:20:41

ahooksaxios

2022-06-10 08:01:01

ahookshook代碼

2023-06-13 07:54:17

DOM 封裝作用域

2014-05-26 16:16:59

Shadow DomWeb Compone

2009-02-10 09:23:03

DOM模型MSXML

2023-02-26 08:42:10

源碼demouseEffect

2024-10-14 12:15:11

2022-06-28 07:41:38

useMountReactahooks

2022-08-16 21:01:56

runAsyncreload數據

2021-01-21 09:09:18

時區轉換程序

2023-09-25 10:26:05

DOMCSS

2021-12-08 07:49:46

Ahooks 3.0React Hooks

2025-07-21 09:30:35

2009-02-27 17:15:05

XMLDOMXPath

2020-11-11 14:19:17

隱私APP設計

2022-06-06 08:02:21

ahooks架構hooks

2010-09-09 17:19:07

HTML DOMXML DOM

2010-09-28 10:24:50

HTML DOMXML DOM

2021-08-06 11:24:35

域名劫持網站安全網絡攻擊
點贊
收藏

51CTO技術棧公眾號

日韩精品极品在线观看| 亚洲综合偷拍欧美一区色| 欧美伊久线香蕉线新在线| 日本丰满少妇裸体自慰 | 另类色图亚洲色图| 95视频在线观看| 制服诱惑亚洲| 亚洲欧洲精品一区二区三区不卡| av免费精品一区二区三区| 亚欧洲精品在线视频| 国产欧美日韩精品高清二区综合区| 欧美亚洲动漫精品| 日韩中文在线字幕| 天天干天天摸天天操| 日韩成人dvd| 色偷偷综合社区| www.美色吧.com| jvid一区二区三区| 亚洲午夜在线视频| 日韩精品久久久| 国产白浆在线观看| 快she精品国产999| 久久97久久97精品免视看 | 久久久久国产一区二区三区四区| 国产日韩换脸av一区在线观看| 久久午夜鲁丝片午夜精品| 国产一区二区三区电影在线观看| 日韩一区二区麻豆国产| 国产精品亚洲a| av在线看片| 久久无码av三级| 国产 高清 精品 在线 a | 欧美一卡在线观看| 欧美综合在线观看视频| 狂野欧美激情性xxxx欧美| 欧美高清在线一区| 久久精品99| 亚洲AV午夜精品| 麻豆免费看一区二区三区| 欧美在线视频观看免费网站| 久热精品在线观看| 亚洲成av人电影| 一色桃子一区二区| 欧美性xxxx图片| 精品福利网址导航| 91精品国产欧美日韩| 污网站免费在线| 91精品xxx在线观看| 亚洲福利视频一区二区| 欧美交换配乱吟粗大25p| 尤物视频在线免费观看| 国产欧美日韩三级| 精品中文字幕一区| 色婷婷av一区二区三区之红樱桃 | 日本精品视频在线播放| 日本少妇吞精囗交| 亚洲黑丝一区二区| 欧美精品九九久久| 欧美日韩免费做爰视频| 久久精品免费一区二区三区| 色一区av在线| 99自拍偷拍视频| 色135综合网| 深夜成人在线观看| 久久久久久久麻豆| 亚洲国产一成人久久精品| 精品国产一区二区三区四区在线观看| 黄色片网站免费| 欧美系列电影免费观看| 中文字幕日韩有码| 日本少妇aaa| 亚洲精品一区二区在线看| 久久精品99国产精品酒店日本| 欧日韩不卡视频| 99免费精品| 久久国产精品亚洲| 欧美日韩在线视频免费播放| 午夜日韩视频| 性欧美长视频免费观看不卡| 青青草成人av| 日韩和的一区二区| 4438全国成人免费| 天堂免费在线视频| 韩日精品视频一区| 粉嫩av一区二区三区免费观看| 丰满人妻av一区二区三区| 波多野结衣视频一区| 欧美午夜免费| 麻豆网在线观看| 亚洲电影在线免费观看| 毛片av免费在线观看| 色综合视频一区二区三区日韩| 日韩天堂在线观看| 久久久久麻豆v国产精华液好用吗| 欧美禁忌电影| 久久精品夜夜夜夜夜久久| 久久成人国产精品入口| 翔田千里一区二区| 91精品久久久久久久久中文字幕 | 国产福利精品导航| 精品婷婷色一区二区三区蜜桃| 成av人电影在线观看| 一区二区三区在线视频免费观看| 日本韩国欧美在线观看| 欧美a一级片| 亚洲第一网站免费视频| 国产又粗又黄又猛| 怡红院精品视频在线观看极品| 国产成人精品免高潮费视频| 国产成人免费看一级大黄| 91在线国产福利| 中文字幕精品一区日韩| 国内精彩免费自拍视频在线观看网址| 欧美亚洲综合网| 亚洲欧美日韩偷拍| 91综合久久| 热99在线视频| 亚洲产国偷v产偷v自拍涩爱| 欧美国产97人人爽人人喊| 人妻av中文系列| 亚洲网站三级| 亚洲人成绝费网站色www| 中文字幕在线观看成人| 奇米影视一区二区三区| 精品产品国产在线不卡| av免费在线观看网址| 在线欧美日韩国产| 天天躁日日躁狠狠躁免费麻豆| 久久国产成人精品| 日本中文字幕久久看| 亚洲精品国产av| 国产精品黄色在线观看| 999香蕉视频| 极品束缚调教一区二区网站 | 91资源在线观看| 91精品在线免费| 极品蜜桃臀肥臀-x88av| 国产精品亚洲综合色区韩国| 成人激情直播| 黄色视屏免费在线观看| 欧美在线制服丝袜| 国产精品无码午夜福利| 亚洲国产日本| 成人毛片网站| 欧美日韩色网| 欧美一级精品大片| 777777国产7777777| 蜜桃精品在线观看| 日韩欧美精品在线不卡| 亚洲sss视频在线视频| 欧美h视频在线| 9lporm自拍视频区在线| 日韩欧美一区二区免费| chinese全程对白| 麻豆精品视频在线观看| 日韩免费电影一区二区| 女生影院久久| 精品一区二区三区三区| 日韩av大片在线观看| 成人av免费在线播放| 欧洲精品在线播放| 国内精品麻豆美女在线播放视频| 久久免费观看视频| 欧美一级淫片aaaaaa| 亚洲超碰97人人做人人爱| 99久久久无码国产精品性波多| 国产精品国码视频| 国产精品三区www17con| 蜜桃视频m3u8在线观看| 亚洲免费人成在线视频观看| 国产精品视频123| 久久久久久久久久久久久久久99| www日韩视频| 久久精品国产99久久| 91九色在线视频| 色图在线观看| 亚洲精品国产综合区久久久久久久| 精品无码久久久久久久久| 成人福利电影精品一区二区在线观看| 国产69精品久久久久999小说| 精品亚洲免a| 国产精品久久久久久久久久久久久久 | 国产精品www色诱视频| 992tv免费直播在线观看| 欧美精品777| 久久国产在线视频| 91丨九色丨黑人外教| 欧美伦理片在线看| 亚洲国产日韩欧美在线| 国产日韩一区二区| 日本中文字幕一区二区| 久久国产精品亚洲| 日韩在线免费播放| 欧美精品123区| 久久精品免费av| 国产日韩欧美电影| 老熟女高潮一区二区三区| 另类av一区二区| 日本xxx免费| 伊人春色之综合网| 成人中文字幕+乱码+中文字幕| 欧美人与性动交α欧美精品图片| 精品亚洲精品福利线在观看| 国产精品国产三级国产aⅴ| 亚洲成人av电影| 在线观看天堂av| 成人av网站在线观看免费| 一区二区三区 欧美| 激情欧美亚洲| 亚洲欧美国产不卡| 全国精品免费看| 91在线国产电影| 无码小电影在线观看网站免费| zzjj国产精品一区二区| 色av男人的天堂免费在线| 91精品国产综合久久久久| 久久夜色精品国产噜噜亚洲av| 一区二区三区欧美日| 欧美 日韩 成人| 波多野结衣亚洲一区| 99999精品| 日本不卡视频一二三区| 9久久9毛片又大又硬又粗| 天天操综合网| 日韩三级在线播放| 欧美性生活一级片| 国产精品theporn88| 999精品嫩草久久久久久99| 欧美亚洲在线视频| 俄罗斯一级**毛片在线播放 | 国产3级在线观看| 91色在线porny| 精品人妻一区二区免费| 精品一区免费av| 国产精品igao| 久久一综合视频| 国自产拍偷拍精品啪啪一区二区| 欧美大片一区| 欧美少妇一区二区三区| 日韩视频在线观看| 日韩免费毛片| 精品国产一区二区三区香蕉沈先生 | 丝袜一区二区三区| 国产一二三在线观看| 日韩久久免费电影| 图片区 小说区 区 亚洲五月| 欧美成人一区二区三区在线观看 | 日韩成人在线网站| 黄色片一区二区三区| 日韩美女一区二区三区四区| 国产欧美久久久| 91精品国产高清一区二区三区蜜臀 | 亚洲九九在线| 日韩视频在线观看视频| 午夜欧美在线| 国产高潮呻吟久久久| 888久久久| 国产在线无码精品| 欧美日韩一视频区二区| 免费极品av一视觉盛宴| 欧美视频久久| 青青草国产免费| 亚洲国产欧美国产综合一区| 欧美久久久久久久久久久久久| 亚洲美洲欧洲综合国产一区| 亚洲中文字幕无码专区| 久久综合婷婷| 簧片在线免费看| 美女视频一区在线观看| 日韩av自拍偷拍| 国产精品一区二区三区乱码| 中文在线字幕观看| 91小视频在线| 欧美日韩国产黄色| 亚洲男同1069视频| 国产精品二区一区二区aⅴ| 精品久久久久久久中文字幕 | 在线国产视频一区| 国产精品丝袜久久久久久app| 最新黄色av网址| 一区二区三区中文免费| 久久久久久久黄色片| 在线日韩一区二区| 国产高中女学生第一次| 亚洲国产日韩欧美在线图片| 久久电影中文字幕| 久久精品视频99| 国产粉嫩在线观看| 国产精品久久久久久久久男 | 性欧美一区二区| 亚洲日本乱码在线观看| 国产在线观看成人| 在线免费精品视频| www.好吊色| 亚洲欧美精品suv| av香蕉成人| 日本精品一区二区三区在线| 在线成人免费| 久久精品久久精品国产大片| 日韩伦理视频| 国产精品网站免费| 久久精品99国产国产精| 扒开伸进免费视频| 国产精品素人视频| 久久露脸国语精品国产91| 欧美日韩国产影片| 五月天久久久久久| 日韩在线观看免费高清| 波多野结衣视频一区二区| 成人有码在线播放| 国产成人调教视频在线观看| 400部精品国偷自产在线观看| 欧美在线综合| 最新国产精品自拍| 中文字幕日韩一区| 国产精品久久久久久人| 精品国产百合女同互慰| 91社区在线观看播放| 91福利视频在线观看| 欧美视频精品全部免费观看| 婷婷久久青草热一区二区| 日韩视频在线一区二区三区| 熟妇无码乱子成人精品| 国产亚洲精品福利| 精品成人免费视频| 日韩视频中午一区| 在线观看美女网站大全免费| 热99精品里视频精品| 黄色欧美网站| 17c丨国产丨精品视频| 国模无码大尺度一区二区三区| 国产美女免费网站| 欧美日韩亚洲一区二| 日本波多野结衣在线| 精品自在线视频| 亚洲日本免费电影| 亚洲黄色成人久久久| 日日骚欧美日韩| av2014天堂网| 五月激情综合婷婷| 蜜桃av噜噜一区二区三区麻豆| 久久香蕉国产线看观看网| 久久婷婷五月综合色丁香| 日韩jizzz| 日韩有码一区二区三区| 国产亚洲精品熟女国产成人| 欧美性猛交xxxx乱大交极品| 天天爱天天干天天操| 午夜精品视频在线| 韩国女主播一区二区三区| 国内少妇毛片视频| 成人性生交大片免费看中文| 久久亚洲国产成人精品性色| 欧美一区二区在线免费播放| 久操视频在线免费播放| 91精品视频专区| 一区二区影视| www.黄色网| 亚洲va国产天堂va久久en| 日韩精品123| 国产成人亚洲综合91| 日韩黄色大片| 国产乱叫456| 亚洲美女视频一区| 亚洲毛片在线播放| 91精品国产精品| 国产日产精品_国产精品毛片| 91色国产在线| 国产精品久久久久久久久搜平片| 国产精品久久免费| 色综合久久悠悠| 久久资源综合| 国产视频在线视频| 一区在线观看视频| 99热这里只有精品在线| 性亚洲最疯狂xxxx高清| 国产成人影院| 日本高清一区二区视频| 亚洲国产中文字幕在线视频综合| 天天干天天干天天干| 国产精品观看在线亚洲人成网 | 无码日本精品xxxxxxxxx| 26uuu亚洲综合色欧美| 亚洲午夜无码久久久久| 欧美成人高清视频| 美女一区二区在线观看| 91制片厂毛片| 亚洲国产日日夜夜| 精品电影在线| 亚洲一区二区免费在线| 国产亚洲精品久久久久婷婷瑜伽| 国产毛片欧美毛片久久久| 欧美一卡二卡三卡四卡| 日产福利视频在线观看| 一本一本a久久| 成人看片黄a免费看在线| 波多野结衣mp4| 欧美黄色三级网站| 欧美日韩第一| 国产大尺度视频|