关于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 删除。

相关文章
|
8月前
|
安全 前端开发 JavaScript
swap薄饼交易所系统开发技术详细/方案项目/逻辑需求/步骤指南/功能流程/源码版
Blockchain platform selection: Choose a suitable blockchain platform as the underlying infrastructure, such as Ethereum, Coin Security smart chain, etc. These platforms provide smart contract functions and transaction confirmation mechanisms, making them suitable for building decentralized exchanges
|
3天前
|
测试技术 区块链
swap开发/区块链跨链技术系统开发规则
跨链技术通过验证源链状态和中继交易至目标链实现交互,关键组件是跨链桥,用于通证在不同链间的转移。桥通过智能合约锁定/销毁源链通证并在目标链解锁/铸造。简单的跨链桥仅适用于通证传输,而可编程通证桥支持更复杂交互,如交易中的交换、借贷等。任意数据消息传递协议则提供更通用功能,能构建跨链DApp,如跨链DEX、NFT和游戏。
|
8月前
|
安全 区块链
ARB链智能合约开发运营版丨ARB链智能合约系统开发详细程序/步骤指南/方案逻辑/源码出售
Environment construction: Before developing a smart contract system on the ARB chain, a corresponding development environment needs to be established. This may include setting up nodes for the ARB chain, development tools, and testing networks.
|
3天前
|
安全 AndFix
swap/dapp/lp只涨不跌项目系统开发详细程序/案例开发/功能逻辑/需求设计/源码技术
Developing an LP (Liquidity Pool) system that only rises without falling requires the following steps
|
3天前
|
前端开发 区块链
swap丨dapp智能合约只涨不跌项目系统开发成熟技术/案例设计/逻辑方案/源码指南
合约:import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
|
3天前
|
存储 供应链 区块链
swap去中心化博饼交易所系统开发|细节详情|技术原理
区块链技术的去中心化和不可篡改性确保了供应链数据的安全性
|
6月前
|
运维 监控 测试技术
Arbitrum(ARB链)公链智能合约系统开发方案逻辑/成熟技术/方案项目/源码出售
Arbitrum(ARB链)是一种二级扩展解决方案,用于构建可扩展、低费用的区块链应用。
|
7月前
|
区块链
关于DEFI模式系统详细方案技术开发逻辑讲解方案
关于DEFI模式系统详细方案技术开发逻辑讲解方案
|
8月前
|
vr&ar
DeFi流动性质押项目系统开发详细步骤/方案逻辑/案例开发/源码程序
DeFi (Decentralized Finance) pledge mining is a blockchain based financial activity that combines pledge and mining mechanisms. It provides a new way to provide benefits to participants and promote the development of a centralized financial ecosystem.
|
10月前
|
区块链 数据安全/隐私保护 安全
swap去中心化交易所兑换池系统开发需求项目丨方案逻辑丨源码案例丨成熟技术丨源码版
  未来区块链交易所的发展趋势是金融衍生品交易。随着加密货币市场的不断发展和壮大,加密货币衍生品的市场也越来越大,区块链交易所需要支持加密货币衍生品的交易,满足市场需求。