关于Free自由协议增发逻辑技术开发详细丨Free模式系统开发项目方案讲解

简介: 本文探讨ahooks 对 DOM 类 Hooks 使用规范,以及在《free dom自由协议质押系统》开发过程中源码是如何去做处理的,有需求和问题的朋友可以来探讨。

本文探讨ahooks 对 DOM 类 Hooks 使用规范,以及在《free dom自由协议质押系统》开发过程中

源码是如何去做处理的,有需求和问题的朋友可以来探讨。

DOM 类 Hooks 使用规范

在这里插入图片描述

这一章节,大部分参考官方文档的 DOM 类 Hooks 使用规范[1]。

一点,ahooks 大部分 DOM 类 Hooks 都会接收 target 参数,本文由V_StPv888整理发布表示要处理的元素。

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(target: BasicTarget, defaultElement?: T) {

// 省略部分代码...

let targetElement: TargetValue;

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 元素以及依赖。

后面每次执行的时候,都判断目标元素或者依赖是

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关文章
|
网络安全 数据安全/隐私保护 Windows
websocket优缺点
websocket优缺点
665 2
|
机器学习/深度学习 算法 PyTorch
PyTorch Lightning:简化深度学习研究与开发
【8月更文第27天】PyTorch Lightning 是一个用于简化 PyTorch 开发流程的轻量级封装库。它的目标是让研究人员和开发者能够更加专注于算法和模型的设计,而不是被训练循环和各种低级细节所困扰。通过使用 PyTorch Lightning,开发者可以更容易地进行实验、调试和复现结果,从而加速研究与开发的过程。
484 1
|
供应链 安全 大数据
区块链与大数据:重构未来世界的密码
在科技飞速发展的时代,大数据被誉为“未来的石油”,区块链则被称为“信任的机器”。两者结合,将如何重塑世界?本文解析区块链与大数据的核心特性——区块链的去中心化、安全透明与大数据的海量、多样、实时价值;展示其在金融、供应链、医疗、交通等领域的应用场景;并展望未来跨界融合、信任重构、智能化发展以及隐私保护的趋势,预示着一个高效可信的新时代的到来。
879 1
|
SQL 关系型数据库 MySQL
|
人工智能 自然语言处理 NoSQL
知识图谱在五大智能领域的应用
知识图谱,以实体-关系三元组形式组织数据,促进高效检索与分析。它支持智能搜索关联分析,智能问答的知识挖掘,智能推荐的个性化服务,以及智能预测如医疗诊断和金融风险识别。知识图谱结合悦数图数据库,加速复杂查询,提升智能应用的精度,驱动AI领域创新,塑造未来智能科技。
|
安全 算法 数据库
MD5、SHA、DES、AES、RSA的算法说明
【5月更文挑战第10天】MD5、SHA、DES、AES、RSA的算法说明
1067 2
|
JavaScript 前端开发 Java
博客管理系统|基于SpringBoot+Vue+ElementUI个人博客系统的设计与实现
博客管理系统|基于SpringBoot+Vue+ElementUI个人博客系统的设计与实现
1402 0
|
NoSQL Serverless Python
在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。
【5月更文挑战第2天】在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。方法一是直接赋值,如`df['C'] = 0`,创建新列C并初始化为0。方法二是应用函数,例如定义`add_column`函数计算A列和B列之和,然后使用`df.apply(add_column, axis=1)`,使C列存储每行A、B列的和。
696 0
|
资源调度 Kubernetes 网络协议
一文搞懂Flink架构与任务编排|青训营笔记
本文主要讲述Flink的整体架构,以及流处理任务涉及的各个算子的调度编排机制。为模仿实现一个简易流处理引擎作下铺垫。
795 0
一文搞懂Flink架构与任务编排|青训营笔记
|
Linux 网络架构 iOS开发
简单纯粹、免费开源的在线测速工具 - 中科大测速网
简单纯粹、免费开源的在线测速工具 - 中科大测速网
41852 0