React 业务场景相关方法封装(hooks 使用)

React 中常用的三方 hooks 库

库名特点常见场景官方文档
ahooks(阿里出品)丰富实用的 Hooks,和 Ant Design 配合最佳useRequest(请求管理)、useDebounceuseLocalStorageState、倒计时、节流https://ahooks.js.org/
React Query(TanStack Query)最强大的 服务端数据管理 库,缓存、重试、乐观更新API 请求、分页、数据缓存与同步https://tanstack.com/query/latest
SWR(Vercel 出品)轻量级数据获取,基于 SWR 策略(Stale-While-Revalidate)Next.js / CSR 数据获取、自动缓存https://swr.vercel.app/
react-use最全的 Hooks 工具库(涵盖浏览器 API、状态管理、UI 控制)本地存储、窗口大小、点击外部、全屏、鼠标状态https://github.com/streamich/react-use
usehooks-ts简洁实用的小 Hook 集合useDarkModeuseCopyToClipboarduseOnClickOutsideuseWindowSizehttps://usehooks-ts.com/
react-huse偏函数式编程的 Hooks 库更偏小众,适合函数式风格项目https://github.com/streamich/react-huse

react-use 相关使用

  1. 安装库 npm install react-use
  2. 按需 import { useXXX } from ‘react-use’
  3. 在组件内直接使用 Hook
  4. 官方文档有丰富示例,几乎涵盖所有常用场景
    • GitHub
    • Hook 列表与示例

Array 相关封装

场景:在开发中,经常需要对数组进行一些操作,如果直接使用原生方法可能会使代码看起来非常臃肿。

hook 封装:

import { useState, useCallback } from "react";/*** 通用数组 Hook* @param {Array} initialValue 初始数组*/
function useArrayState(initialValue = []) {const [array, setArray] = useState(initialValue);// 添加元素const push = useCallback((item) => {setArray((prev) => [...prev, item]);}, []);// 根据索引更新const updateByIndex = useCallback((index, newItem) => {setArray((prev) => {const newArr = [...prev];newArr[index] = newItem;return newArr;});}, []);// 根据 id 更新const updateById = useCallback((id, updater) => {setArray((prev) =>prev.map((item) =>item.id === id ? { ...item, ...updater(item) } : item));}, []);/*** ✅ 根据条件更新* @param {Function} predicate 条件函数* @param {Function} updater 更新函数* @param {"first"|"all"} mode 更新模式(默认 "all")*/const updateByCondition = useCallback((predicate, updater, mode = "all") => {setArray((prev) => {if (mode === "first") {const newArr = [...prev];const index = newArr.findIndex(predicate);if (index !== -1) {newArr[index] = { ...newArr[index], ...updater(newArr[index]) };}return newArr;}// 默认 all:更新所有满足条件的元素return prev.map((item) =>predicate(item) ? { ...item, ...updater(item) } : item);});}, []);// 删除元素(按索引)const removeByIndex = useCallback((index) => {setArray((prev) => prev.filter((_, i) => i !== index));}, []);// 删除元素(按 id)const removeById = useCallback((id) => {setArray((prev) => prev.filter((item) => item.id !== id));}, []);// 清空数组const clear = useCallback(() => setArray([]), []);return {array,setArray,push,updateByIndex,updateById,updateByCondition, // ✅ 新增,支持 "first" | "all"removeByIndex,removeById,clear,};
}export default useArrayState;

使用:

import React from "react";
import useArrayState from "./useArrayState";const Demo = () => {const { array, updateByCondition, push } = useArrayState([{ id: 1, name: "Alice", age: 20 },{ id: 2, name: "Bob", age: 25 },{ id: 3, name: "Charlie", age: 30 },]);return (<div><h3>数组管理示例</h3><pre>{JSON.stringify(array, null, 2)}</pre>{/* 更新第一个年龄大于 21 的用户 */}<buttononClick={() =>updateByCondition((item) => item.age > 21,() => ({ name: "🔥 First Updated" }),"first" // ✅ 只更新第一个符合条件的)}>更新第一个符合条件的用户</button>{/* 更新所有年龄大于 21 的用户 */}<buttononClick={() =>updateByCondition((item) => item.age > 21,() => ({ name: "🔥 All Updated" }),"all" // ✅ 默认,更新所有符合条件的)}>更新所有符合条件的用户</button><buttononClick={() => push({ id: Date.now(), name: "New User", age: 28 })}>添加新用户</button></div>);
};export default Demo;

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

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

相关文章

[高并发系统设计] - 搭建高并发高可用的系统 - 学习与探究

1.应用场景 主要用于高并发系统设计的架构演进和架构思路。 2.学习/操作 1.文档阅读 搭建高并发、高可用的系统 | Laravel China 社区 高并发&#xff0c; 你真的理解透彻了吗&#xff1f; - 知乎 PHP实战经验之系统如何支撑高并发-51CTO.COM PHP高并发和大流量解决方案整理 …

【小白笔记】Visual Studio 在 2025年7月更新的功能说明(英文单词记忆)

这是NVIDIA软件中关于数据收集&#xff08;Usage Collection&#xff09;的选项。术语解释NVIDIA Nsight Visual Studio Edition&#xff1a;这是一款由NVIDIA开发的工具&#xff0c;专门用于在Visual Studio这个集成开发环境&#xff08;IDE&#xff09;中进行GPU调试和性能分…

THM Whats Your Name WP

信息收集[2025-08-28 21:41:30] [SUCCESS] 端口开放 10.10.208.188:80[2025-08-28 21:41:30] [SUCCESS] 端口开放 10.10.208.188:22[2025-08-28 21:41:31] [SUCCESS] 端口开放 10.10.208.188:8081[2025-08-28 21:41:31] [SUCCESS] 服务识别 10.10.208.188:22 > [ssh] 版本:8…

MySQL底层数据结构与算法浅析

1、概述 MySQL中&#xff0c;当我们发现某个sql的执行时间很长时&#xff0c;最先想到的就是给表加索引&#xff0c;加了索引之后&#xff0c;查询性能就会有显著的提升。 为了知其所以然&#xff0c;那么只有去了解MySQL的底层储存结构和索引的查询算法&#xff0c;只有这样才…

VisualStudio 将xlsx文件嵌入到资源中访问时变String?

如题&#xff0c;就是这么诡异&#xff0c;时至如今已经是visual studio 2022了&#xff0c;你通过界面导入xlsx文件到资源中&#xff0c;它的类型就是String而且没法修改! 即使将文件压缩成zip再导入&#xff0c;依然是String&#xff01; 三哥的骚操作问你服不服! 然而&#…

【视频讲解】R语言海七鳃鳗性别比分析:JAGS贝叶斯分层逻辑回归MCMC采样模型应用

全文链接&#xff1a;https://tecdat.cn/?p43774 原文出处&#xff1a;拓端抖音号拓端tecdat 分析师&#xff1a;Yifei Liu 【视频讲解】R语言海七鳃鳗性别比分析&#xff1a;JAGS贝叶斯分层逻辑回归引言&#xff1a;生态人都懂的痛——样本少、结果被质疑&#xff0c;咋办&am…

Android14 USB子系统的启动以及动态切换相关的init.usb.rc详解

init.usb.rc的作用是在Android系统启动和运行时&#xff0c;通过监听属性&#xff08;sys.usb.config和sys.usb.configfs, sys.usb.typec.mode&#xff09;变化动态&#xff0c;通过写入内核接口 /sys/class/android_usb/ 来配置USB模式。1 USB子系统的启动1.1 on init阶段的配…

宜春城区SDH网图分析

一、SDH网图展示 图片来源&#xff1a; 本地网传输网组SDH网图(2014年12月) - 百度文库 SDH就是Synchronous Digital Hierarchy&#xff0c;同步数字体系的意思。 从分布图可以看出&#xff0c;城区网和工业网一样&#xff0c;是环状结构&#xff0c;保障数据传输的稳定。我的…

lwIP MQTT 心跳 Bug 分析与修复

一、背景在使用 lwIP 内置 MQTT 客户端时&#xff0c;如果你用的是 2.2.0 之前的版本&#xff0c;很可能会遇到一个恼人的问题&#xff1a;客户端和服务器正常连接&#xff0c;但一段时间后 会话被 broker 踢掉。比如常见的现象&#xff1a;Mosquitto / EMQX 日志显示客户端超时…

Golang 面试题「中级」

以下是 100 道 Golang 中级面试题及答案&#xff0c;涵盖并发编程、内存管理、接口实现、标准库深入应用等核心知识点&#xff1a; 一、并发编程基础与进阶问题&#xff1a;Golang 的 GPM 调度模型中&#xff0c;G、P、M 分别代表什么&#xff1f;它们的协作关系是怎样的&#…

沃尔玛AI系统Wally深度拆解:零售业库存周转提速18%,动态定价争议与员工转型成热议点

最近去沃尔玛购物&#xff0c;发现以前总断货的那款早餐麦片居然常年摆在最显眼的货架上&#xff0c;而且价格每周末都会微调——这可不是巧合&#xff0c;背后藏着零售业最硬核的AI操作。沃尔玛去年推出的智能系统Wally&#xff0c;正悄悄改变着我们买东西的体验和商家的运营逻…

AutoDL算力云上传文件太慢了如何解决?

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章&#xff0c;有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn&#xff0c;这里还有很多有关计算机的知识&#xff0c;欢迎进行留言或…

【智慧城市】2025年中国地质大学(武汉)暑期实训优秀作品(2):智慧城市西安与一带一路

PART 01 项目背景01政策与时代背景近年来&#xff0c;随着科技的飞速发展和政策的积极推动&#xff0c;我国新型智慧城市建设取得了显著成效。在“十四五”国家信息化规划中&#xff0c;明确提出要打造智慧高效的城市治理体系&#xff0c;推动城市管理精细化、服务智能化。同时…

MySQL数据库精研之旅第十四期:索引的 “潜规则”(上)

专栏&#xff1a;MySQL数据库成长记 个人主页&#xff1a;手握风云 目录 一、索引简介 1.1. 索引是什么 1.2. 为什么需要索引 二、索引应该选择哪种数据结构 2.1. Hash 2.2. 二叉搜索树 2.3. N叉树 2.4. B树 三、MySQL中的页 3.1. 为什么要使用页 3.2. 页文件头和页…

架构设计——云原生与分布式系统架构

** 云原生与分布式系统架构** 5.1 云选型策略&#xff1a;多云、混合云还是单云&#xff1f;如何决定&#xff1f; “上云”已无需讨论&#xff0c;但“上什么云”是第一个战略决策。单云&#xff08;Single Cloud&#xff09;策略&#xff1a; 描述&#xff1a; 将全部资源集中…

Python图片转WebP常用库推荐:Pillow、Wand、cv2

摘要 Python转换图片为WebP&#xff0c;Pillow最推荐&#xff1a;安装简单&#xff08;pip install pillow&#xff09;、使用方便&#xff0c;代码示例显示处理RGBA转RGB等细节&#xff0c;适合多数场景&#xff1b;Wand功能更强基于ImageMagick&#xff0c;适合需高级处理的场…

Android WPS Office 18.20

WPS Office是一款集Word&#xff0c;PDF&#xff0c;Sheet&#xff0c;PowerPoint&#xff0c;表格&#xff0c;文档&#xff0c;云存储&#xff0c;模板库和在线编辑与共享于一体的多功能免费办公套件。它提供类似于Microsoft Office的功能&#xff0c;包括文字处理、表格编辑…

Elasticsearch核心配置与性能优化

以下是Elasticsearch&#xff08;ES&#xff09;的 核心配置项 及 性能优化措施&#xff0c;涵盖硬件、系统、ES配置、索引设计等关键方面&#xff0c;帮助提升集群稳定性与查询性能&#xff1a;一、硬件与系统层优化内存分配 堆内存&#xff08;Heap Size&#xff09;&#xf…

【谷歌浏览器】浏览器实用自用版——谷歌浏览器(Google Chrome)离线纯净版安装 官方版无任何捆绑及广告 【离线安装谷歌浏览器】

经常上网的朋友们肯定深有体会&#xff1a;如今不少浏览器动不动就弹广告、塞插件&#xff0c;用起来简直是折磨。面对这些“全家桶”式捆绑&#xff0c;大家都渴望能找到一款干净、简洁、无打扰的浏览器——这时候&#xff0c;Google Chrome&#xff08;谷歌浏览器&#xff09…

2025年渗透测试面试题总结-39(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 3. SAST&#xff08;静态应用安全测试&#xff09; 4. IAST&#xff08;交互式应用安全测试&#xff09; …