模拟react中的hooks方法,实现自定义的hooks来封装我们需要重复使用的组件,来优化代码。这种hooks也是利用了react的原生hooks来实现我们需要的特定业务,可以返回任何我们需要的值,也可以不返回值,作为一个副作用方法使用

第三方hooks

  • ahooks 官网地址 https://ahooks.js.org/zh-CN
    在这里插入图片描述
  • react-use 文档地址: https://github.com/streamich/react-use
    在这里插入图片描述

下面,封装了几个自己的简单hooks,加深下对hooks的理解

修改页面标题

  • 实现效果
    在这里插入图片描述

  • 实现代码

import { useEffect } from 'react'export function useTitle(title: string): void {useEffect(() => {document.title = title}, [])
}

捕获鼠标位置

  • 实现效果
    请添加图片描述
  • 实现代码
import { useCallback, useEffect } from 'react'
import { useImmer } from 'use-immer'type TPosition = {x: numbery: number
}function useMouse(): TPosition {const [position, setPosition] = useImmer<TPosition>({x: 0,y: 0})const updateMouse = useCallback((e: MouseEvent) => {console.log('useEffect updateMouse')setPosition(draft => {draft.x = e.clientXdraft.y = e.clientY})}, [])useEffect(() => {document.addEventListener('mousemove', updateMouse)return () => {document.removeEventListener('mousemove', updateMouse)}})return position
}export default useMouse

异步请求

  • 实现效果
    请添加图片描述
  • 实现代码
import { useEffect } from 'react'
import { useImmer } from 'use-immer'type TResult = {name: stringage: number
}
function getInfo(): Promise<TResult> {return new Promise(resolve => {setTimeout(() => {resolve({name: 'why',age: 18})}, 2000)})
}const useGetInfo = () => {const [loading, setLoading] = useImmer(false)const [info, setInfo] = useImmer<TResult | null>(null)useEffect(() => {setLoading(true)getInfo().then(result => {setInfo(result)setLoading(false)})}, [])return { loading, info }
}export default useGetInfo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90404.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90404.shtml
英文地址,请注明出处:http://en.pswp.cn/web/90404.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue CSR 到 Nuxt 3 SSR 迁移:技术实现与问题解决实录

1. 迁移动机与技术选型1.1 CSR 架构的局限性 基于 Vue 3 和 Vite 构建的客户端渲染 (CSR) 单页应用 (SPA) 提供了良好的开发体验和用户交互流畅性。但是其核心局限在于&#xff1a;搜索引擎优化 (SEO)&#xff1a;初始 HTML 响应仅包含一个根 div 元素&#xff0c;实际内容由 J…

FastGPT + Kymo:解锁企业专属知识库与智能体开发新体验

在信息爆炸的时代&#xff0c;企业如何让知识“活起来”&#xff1f;传统文档库和搜索框早已无法满足需求。FastGPT——基于RAG技术的开源知识库系统&#xff0c;正重新定义企业级知识管理&#xff01; 一、FastGPT是什么&#xff1f; FastGPT是企业构建专属知识库的智能核心…

人形机器人_双足行走动力学:Maxwell模型及在拟合肌腱特性中的应用

一、Maxwell模型及其在拟合肌腱特性中的应用Maxwell模型是经典的粘弹性力学模型之一&#xff0c;由弹簧&#xff08;弹性元件&#xff09;和阻尼器&#xff08;粘性元件&#xff09;串联组成。其在生物力学领域的应用主要聚焦于材料的动态响应&#xff08;如应力松弛和蠕变&…

「iOS」——KVC

源码学习iOS底层学习&#xff1a;KVC 底层原理一、核心 API 与功能特性**常用方法**KVC 设值 底层原理KVC 取值 底层原理自定义KVC设值取值**特性&#xff1a;无隐私访问****原理**四、多元应用场景1. **动态数据处理**&#xff08;1&#xff09;字典转模型&#xff08;2&#…

【Lucene】leafreadercontext逻辑段与segment物理磁盘段的关系

在 Lucene 中&#xff0c;“叶子段”&#xff08;LeafReaderContext&#xff09;和 “segment”&#xff08;物理段&#xff09;在 Lucene 语境下&#xff0c;LeafReaderContext ≈ segment 的运行时只读视图。概念 所在层次 含义 是否一一对应 segment 物理存储层 Lucene 索引…

Python进阶第三方库之Matplotlib

应用Matplotlib的基本功能实现图形显示 应用Matplotlib实现多图显示 应用Matplotlib实现不同画图种类 1、什么是Matplotlib是专门用于开发2D图表(包括3D图表) 以渐进、交互式方式实现数据可视化 2、为什么要学习Matplotlib可视化是在整个数据挖掘的关键辅助工具&#xff0c;可以…

【深度解析】从AWS re_Invent 2025看云原生技术发展趋势

2025 年 6 月 28 日 在科技浪潮持续翻涌的当下&#xff0c;云原生技术已然成为推动企业数字化转型与创新发展的关键力量。而 AWS re:Invent 作为云计算领域一年一度的盛会&#xff0c;向来是展示前沿技术、洞察行业趋势的重要舞台。在今年的 AWS re:Invent 2025 大会上&#xf…

高亮标题里的某个关键字正则表达式

使用v-html渲染&#xff0c;写一个高亮方法<span class"title-name" v-html"highlightKeywords(name, keywords)"></span>这里传入的name带了文件拓展名&#xff0c;所以先把名称从文件名里提取出来// 高亮标题颜色highlightKeywords(name, ke…

视频编解码中colorspace,color_range,color_trc,color_primaries,是做什么用的,是谁来指定的

在视频编解码中&#xff0c;colorspace&#xff08;色彩空间&#xff09;、color_range&#xff08;色域范围&#xff09;、color_trc&#xff08;传输特性&#xff09;、color_primaries&#xff08;原色&#xff09;是一组色彩相关元数据&#xff0c;它们共同决定了视频的颜色…

【QT】 Qt背景介绍与概述

文章目录&#x1f4dd;Qt背景介绍&#x1f320; 什么是Qt&#x1f309;Qt的发展史&#x1f320; Qt⽀持的平台&#x1f309; Qt版本&#x1f309; Qt的优点&#x1f309; Qt的应⽤场景&#x1f320; Qt的成功案例&#x1f320; Qt的发展前景及就业分析&#x1f6a9;总结&#x…

如何将拥有的域名自定义链接到我的世界服务器(Minecraft服务器)

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

2025暑期—07深度学习应用-总结

人有自动选取卷积核的能力&#xff0c;传统的图像处理不能自动选取卷积核非线性作用函数&#xff0c;Sigmoid由于梯度消失使用Relu。卷积神经网络的卷积核是未知的&#xff0c;自适应的。其中的权重是不断变化的&#xff0c;就是卷积核是不断变化的。卷积模糊了&#xff0c;池化…

数据结构-4(常用排序算法、二分查找)

一、思维导图二、冒泡排序def bubble_sort(ls):"""用i循环,逐步比较相邻元素,直到循环结束,停止交换&#xff0c;就像一个个气泡从下往上冒泡,每一次的循环结果都是最大的元素到了后面已排序序列的列首。"""j 0 # 用于确定循环次数,同时用于下…

策略模式(Strategy Pattern)+ 模板方法模式(Template Method Pattern)的组合使用

using Microsoft.Extensions.DependencyInjection;namespace ConsoleApp9 {internal class Program{static async Task Main(string[] args){Console.WriteLine("Hello, World!");// 创建并配置依赖注入容器var _serviceProvider new ServiceCollection().AddScoped…

es0102---语法格式、数据类型、整合springboot、创建库、创建映射、新增数据、自定义查询

ES 一、创建映射字段的语法格式 需要先构建索引库&#xff0c;在构建索引库中的映射关系 PUT /索引库名/_mapping {"properties": {"字段名": {"type": "类型","index": true&#xff0c;"store": false&#…

spring boot h2数据库无法链接问题

spring boot h2数据库无法链接问题datasource:# 数据库连接地址&#xff1a;H2在2.x后&#xff0c;不再支持创建数据库&#xff0c;需要手工创建&#xff0c;如&#xff1a;touch test.mv.db&#xff0c;# 否则会报“Database file not found”错误url: jdbc:h2:file:~/testdri…

pycharm配conda环境

最近在做表情包&#xff0c;画出来的表情包大小不一&#xff0c;但是vx表情包平台要求统一都是240*240的&#xff0c;所以用Pillow统一处理的一下。 如果你本地装的python并且添加到path了&#xff0c;pycharm可以自动获取到&#xff0c;但是我装得miniconda&#xff0c;pychar…

【Elasticsearch】Elasticsearch 跨机房部署

《Elasticsearch 集群》系列&#xff0c;共包含以下文章&#xff1a; 1️⃣ 冷热集群架构2️⃣ 合适的锅炒合适的菜&#xff1a;性能与成本平衡原理公式解析3️⃣ ILM&#xff08;Index Lifecycle Management&#xff09;策略详解4️⃣ Elasticsearch 跨机房部署5️⃣ 快照与恢…

立式数控深孔钻的工艺及光学检测方法 —— 激光频率梳 3D 轮廓检测

引言立式数控深孔钻作为深孔加工的关键设备&#xff0c;其工艺水平直接影响零件加工质量。深孔加工面临排屑、散热等挑战&#xff0c;而光学检测技术的发展为深孔加工精度控制提供了新途径。激光频率梳 3D 轮廓检测技术与立式数控深孔钻工艺的结合&#xff0c;实现了深孔加工与…

【YOLO系列】YOLOv4详解:模型结构、损失函数、训练方法及代码实现

YOLOv4详解&#xff1a;模型结构、损失函数、训练方法及代码实现 motivation YOLO系列作者Joseph Redmon与Alexey Bochkovskiy致力于解决目标检测领域的核心矛盾&#xff1a;精度与速度的平衡。YOLOv4的诞生源于两大需求&#xff1a; 工业落地&#xff1a;在移动端/边缘设备…