当前位置: 首页 > news >正文

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

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.dtcms.com/a/354479.html

相关文章:

  • 【AI自动化】VSCode+Playwright+codegen+nodejs自动化脚本生成
  • Git 删除文件
  • WINTRUST!_ExplodeMessag函数中的pCatAdd
  • 【大前端】React useEffect 详解:从入门到进阶
  • 响应用户:React中的事件处理机制
  • [linux仓库]透视文件IO:从C库函数的‘表象’到系统调用的‘本质’
  • RSA+AES 混合加密不复杂,但落地挺烦,我用 Vue+PHP 封装成了两个库
  • XTUOJ C++小练习(素数的判断,数字塔,字母塔)
  • 亚马逊合规风控升级:详情页排查与多账号运营安全构建
  • Unity游戏打包——Android打包环境(Mac下)
  • PDF压缩如何平衡质量与体积?
  • Electron 简介:Node.js 桌面开发的起点
  • 小鹏自动驾驶的BEV占用网络有哪些优势?
  • “矿山”自动驾驶“路网”编辑功能实现
  • Mip-splatting
  • 在docker 中拉取xxl-job以及配置数据库
  • 【Linux】Linux基础开发工具从入门到实践
  • Redis 哨兵(Sentinel)全面解析
  • JavaSE丨集合框架入门:从0掌握Collection与List核心用法
  • Two Knights (数学)
  • Feign整合Sentinel实现服务降级与Feign拦截器实战指南
  • uni-app 网络请求与后端交互完全指南:从基础到实战
  • 智能养花谁更优?WebIDE PLOY技术与装置的结合及实践价值 —— 精准养护的赋能路径
  • 【LeetCode】29. 两数相除(Divide Two Integers)
  • PhotoshopImageGenerator:基于Photoshop的自动化图像数据集生成工具
  • C# 操作 DXF 文件指南
  • WAF对比传统防火墙的优劣势
  • 从Cgroups精准调控到LXC容器全流程操作​:用pidstat/stress测试Cgroups限流,手把手玩转Ubuntu LXC容器全流程​
  • 打破存储局限:CS 创世 SD NAND 如何优化瑞芯微(RK)与北京君正平台的贴片式 SD 卡性能
  • 横扫SQL面试——流量与转化率分类