ahooks 工具函数介绍
isBrowser
判断当前环境是否是 浏览器端
ts
// packages/hooks/src/utils/isBrower.ts
const isBrowser =
!!(
typeof window !== 'undefined' &&
window.document &&
window.document.createElement
);
export default isBrowser;
useEffectWithTarget、useLayoutEffectWithTarget
ahooks 中很多自定义 hooks 都会用到这个工具函数
useEffectWithTarget
ts
// packages/hooks/utils/useEffectWithTarget.ts
import { useEffect } from 'react';
import createEffectWithTarget from './createEffectWithTarget';
const useEffectWithTarget = createEffectWithTarget(useEffect);
export default useEffectWithTarget;
useLayoutEffectWithTarget
ts
// packages/hooks/utils/useLayoutEffectWithTarget.ts
import { useLayoutEffect } from 'react';
import createEffectWithTarget from './createEffectWithTarget';
const useEffectWithTarget = createEffectWithTarget(useLayoutEffect);
export default useEffectWithTarget;
具体实现看 createEffectWithTarget 的详细分析
getTargetElement
解析获取 dom 节点
ts
// packages/hooks/utils/domTarget.ts
type TargetValue<T> = T | undefined | null;
type TargetType = HTMLElement | Element | Window | Document;
export type BasicTarget<T extends TargetType = Element> =
| (() => TargetValue<T>)
| TargetValue<T>
| MutableRefObject<TargetValue<T>>;
export function getTargetElement<T extends TargetType>(
target: BasicTarget<T>, // dom,() => dom, ref
defaultElement?: T // 默认值
) {
if (!isBrowser) {
return undefined;
}
if (!target) {
return defaultElement;
}
let targetElement: TargetValue<T>;
// 获取 dom 元素
if (isFunction(target)) {
targetElement = target();
} else if ('current' in target) {
targetElement = target.current;
} else {
targetElement = target;
}
return targetElement;
}
depsAreSame
使用 Object.is 遍历依赖项对应属性值是否一致
ts
// packages/hooks/utils/depsAreSame.ts
import type { DependencyList } from 'react';
export default function depsAreSame(
oldDeps: DependencyList, // 旧的依赖
deps: DependencyList // 新的依赖
): boolean {
if (oldDeps === deps) return true;
for (let i = 0; i < oldDeps.length; i++) {
if (!Object.is(oldDeps[i], deps[i])) return false;
}
return true;
}
isDev
ts
// packages/hooks/utils/isDev.ts
const isDev =
process.env.NODE_ENV === "development" ||
process.env.NODE_ENV === "test";
export default isDev;