beautiful-react-hooks库——入门实践常用hook详解

简介

beautiful-react-hooks 是一个专为 React 设计的高质量自定义 Hooks 集合,涵盖了事件、状态、生命周期、DOM 操作、性能优化等多个方面,极大提升了函数组件的开发效率和代码复用性。

安装方法

npm install beautiful-react-hooks
# 或
yarn add beautiful-react-hooks

常用 Hook 分类与详解

useToggle —— 布尔值/任意值切换

import useToggle from "beautiful-react-hooks/useToggle";export default function BeautifulHooks() {const [on, toggle] = useToggle(false);return (<div className="container p-4"><buttononClick={toggle}className={`px-4 py-2 rounded mb-2 text-white font-medium transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-400 ${on ? "bg-green-500 hover:bg-green-600" : "bg-red-500 hover:bg-red-600"}`}>{on ? "开关已打开" : "开关已关闭"}</button><div className="mt-2 text-base">当前状态:<b className={on ? "text-green-600" : "text-red-600"}>{on ? "ON" : "OFF"}</b></div></div>);
}

usePreviousValue —— 获取前一个值

import useToggle from "beautiful-react-hooks/useToggle";
import usePreviousValue from "beautiful-react-hooks/usePreviousValue";export default function BeautifulHooks() {const [on, toggle] = useToggle(false);const prevOn = usePreviousValue(on);return (<div className="container p-4"><buttononClick={toggle}className={`px-4 py-2 rounded mb-2 text-white font-medium transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-400 ${on ? "bg-green-500 hover:bg-green-600" : "bg-red-500 hover:bg-red-600"}`}>{on ? "开关已打开" : "开关已关闭"}</button><div className="mt-2 text-base">当前状态:<b className={on ? "text-green-600" : "text-red-600"}>{on ? "ON" : "OFF"}</b></div><div className="mt-1 text-sm text-gray-500">上一次状态:<b className={prevOn ? "text-green-600" : "text-red-600"}>{prevOn === undefined ? "无" : prevOn ? "ON" : "OFF"}</b></div></div>);
}

useObjectState —— 对象状态管理

import useObjectState from "beautiful-react-hooks/useObjectState";export default function BeautifulHooks() {const [form, setForm] = useObjectState({ name: "", age: "" });return (<div className="container p-4"><div className="mt-6 p-4 border rounded bg-gray-50"><div className="mb-2 font-semibold">useObjectState 示例</div><div className="flex flex-col gap-2"><inputclassName="border px-2 py-1 rounded focus:outline-none focus:ring-2 focus:ring-blue-400"type="text"placeholder="姓名"value={form.name}onChange={(e) => setForm({ name: e.target.value })}/><inputclassName="border px-2 py-1 rounded focus:outline-none focus:ring-2 focus:ring-blue-400"type="number"placeholder="年龄"value={form.age}onChange={(e) => setForm({ age: e.target.value })}/></div><div className="mt-2 text-sm text-gray-700">当前表单状态:<span className="font-mono">{JSON.stringify(form)}</span></div></div></div>);
}

useValidatedState —— 校验型状态

import useValidatedState from "beautiful-react-hooks/useValidatedState";export default function BeautifulHooks() {// 校验函数:密码长度大于3const passwordValidator = (password) => password.length > 3;const [password, setPassword, validation] = useValidatedState(passwordValidator,"");return (<div className="container p-4"><div className="mb-2 font-semibold">useValidatedState 示例</div><inputclassName={`border px-2 py-1 rounded focus:outline-none focus:ring-2 focus:ring-blue-400 w-64 ${!validation.valid ? "border-red-500" : ""}`}type="password"placeholder="请输入密码(大于3位)"value={password}onChange={(e) => setPassword(e.target.value)}/><div className="mt-2 text-sm">{validation.valid ? (<span className="text-green-600">密码合法</span>) : (<span className="text-red-500">密码太短</span>)}</div></div>);
}

useEvent —— 事件回调

import { useState, useRef } from "react";
import useEvent from "beautiful-react-hooks/useEvent";export default function BeautifulHooks() {const targetRef = useRef();const [clicksNo, setClicksNo] = useState(0);const onTargetClick = useEvent(targetRef, "click");onTargetClick(() => {setClicksNo((c) => c + 1);});return (<div className="container p-4"><div className="mb-2 font-semibold">useEvent 示例</div><divref={targetRef}className="p-4 border rounded cursor-pointer select-none hover:bg-blue-50 text-gray-800">点击此文本增加计数:{clicksNo}</div></div>);
}

useGlobalEvent —— 全局事件监听

import { useState } from "react";
import useGlobalEvent from "beautiful-react-hooks/useGlobalEvent";export default function BeautifulHooks() {const [windowWidth, setWindowWidth] = useState(window.innerWidth);const onWindowResize = useGlobalEvent("resize");onWindowResize(() => {setWindowWidth(window.innerWidth);});return (<div className="container p-4"><div className="mb-2 font-semibold">useGlobalEvent 示例</div><div className="mb-4 p-3 bg-blue-50 border border-blue-200 rounded text-blue-800">调整浏览器窗口大小以更新状态</div><div className="p-4 border rounded bg-gray-50 text-gray-800">window width:{" "}<span className="inline-block px-2 py-1 bg-green-100 text-green-700 rounded font-mono">{windowWidth}</span></div></div>);
}

useWindowResize —— 监听窗口尺寸变化

import useWindowResize from "beautiful-react-hooks/useWindowResize";
import { useState } from "react";export default function BeautifulHooks() {const [size, setSize] = useState({width: window.innerWidth,height: window.innerHeight,});useWindowResize(() => {setSize({ width: window.innerWidth, height: window.innerHeight });});return (<div className="container p-4"><div className="mb-2 font-semibold">useWindowResize 示例</div><div className="p-4 border rounded bg-gray-50 text-gray-800">当前窗口尺寸:<span className="font-mono">{size.width} x {size.height}</span></div></div>);
}

useDebouncedCallback —— 防抖回调

import useDebouncedCallback from "beautiful-react-hooks/useDebouncedCallback";
import { useState } from "react";export default function BeautifulHooks() {const [value, setValue] = useState("");const [debouncedValue, setDebouncedValue] = useState("");const debounced = useDebouncedCallback((val) => {setDebouncedValue(val);}, 800);const handleChange = (e) => {setValue(e.target.value);debounced(e.target.value);};return (<div className="container p-4"><div className="mb-2 font-semibold">useDebouncedCallback 示例</div><inputclassName="border px-2 py-1 rounded focus:outline-none focus:ring-2 focus:ring-blue-400 w-64"type="text"placeholder="输入内容,800ms后触发防抖"value={value}onChange={handleChange}/><div className="mt-2 text-gray-700 text-sm">最后一次防抖触发内容:<span className="font-mono">{debouncedValue}</span></div></div>);
}

useThrottledCallback —— 节流回调

import useThrottledCallback from "beautiful-react-hooks/useThrottledCallback";
import { useState } from "react";export default function BeautifulHooks() {const [value, setValue] = useState("");const [throttledValue, setThrottledValue] = useState("");const throttled = useThrottledCallback((val) => {setThrottledValue(val);}, 800);const handleChange = (e) => {setValue(e.target.value);throttled(e.target.value);};return (<div className="container p-4"><div className="mb-2 font-semibold">useThrottledCallback 示例</div><inputclassName="border px-2 py-1 rounded focus:outline-none focus:ring-2 focus:ring-blue-400 w-64"type="text"placeholder="输入内容,800ms节流触发"value={value}onChange={handleChange}/><div className="mt-2 text-gray-700 text-sm">最后一次节流触发内容:<span className="font-mono">{throttledValue}</span></div></div>);
}

useDidMount —— 组件挂载时执行

import useDidMount from "beautiful-react-hooks/useDidMount";
import { useState } from "react";export default function BeautifulHooks() {const [mounted, setMounted] = useState(false);useDidMount(() => {setMounted(true);});return (<div className="container p-4"><div className="mb-2 font-semibold">useDidMount 示例</div>{mounted && (<div className="p-4 border rounded bg-green-50 text-green-800">组件已挂载!</div>)}</div>);
}

useWillUnmount —— 组件卸载时执行

import useWillUnmount from "beautiful-react-hooks/useWillUnmount";
import { useState } from "react";export default function BeautifulHooks() {const [show, setShow] = useState(true);useWillUnmount(() => {alert("组件已卸载!");});return (<div className="container p-4"><div className="mb-2 font-semibold">useWillUnmount 示例</div><buttonclassName="px-4 py-2 rounded bg-blue-500 hover:bg-blue-600 text-white font-medium mb-4"onClick={() => setShow(false)}>卸载组件</button>{show && <UnmountDemo />}</div>);
}function UnmountDemo() {useWillUnmount(() => {alert("子组件已卸载!");});return (<div className="p-4 border rounded bg-green-50 text-green-800">子组件挂载中,点击上方按钮卸载</div>);
}

useLocalStorage —— 本地存储状态

import useLocalStorage from "beautiful-react-hooks/useLocalStorage";export default function BeautifulHooks() {const [count, setCount] = useLocalStorage("counter", 0);return (<div className="container p-4"><div className="mb-2 font-semibold">useLocalStorage 示例</div><div className="flex items-center gap-4 mb-4"><buttonclassName="px-4 py-2 rounded bg-blue-500 hover:bg-blue-600 text-white font-medium"onClick={() => setCount((c) => c - 1)}>-</button><span className="text-2xl font-mono">{count}</span><buttonclassName="px-4 py-2 rounded bg-blue-500 hover:bg-blue-600 text-white font-medium"onClick={() => setCount((c) => c + 1)}>+</button></div><div className="text-gray-500 text-sm">计数值会自动保存在 localStorage</div></div>);
}

useOnlineState —— 网络状态检测

import useOnlineState from "beautiful-react-hooks/useOnlineState";export default function BeautifulHooks() {const online = useOnlineState();return (<div className="container p-4"><div className="mb-2 font-semibold">useOnlineState 示例</div><divclassName={`p-4 border rounded text-lg font-mono ${online? "bg-green-50 text-green-700 border-green-200": "bg-red-50 text-red-700 border-red-200"}`}>{online ? "当前在线" : "当前离线"}</div></div>);
}

useDarkMode —— 深色模式切换

import useDarkMode from "beautiful-react-hooks/useDarkMode";export default function BeautifulHooks() {const { toggle, enable, disable, isDarkMode } = useDarkMode();return (<divclassName={`container p-4 min-h-screen transition-colors duration-300 ${isDarkMode ? "bg-gray-900 text-white" : "bg-white text-gray-900"}`}><div className="mb-2 font-semibold">useDarkMode 示例</div><div className="flex gap-2 mb-4"><buttonclassName="px-4 py-2 rounded bg-blue-600 hover:bg-blue-700 text-white font-medium"onClick={enable}>启用暗黑模式</button><buttonclassName="px-4 py-2 rounded bg-gray-300 hover:bg-gray-400 text-gray-900 font-medium"onClick={disable}>关闭暗黑模式</button><buttonclassName="px-4 py-2 rounded bg-indigo-500 hover:bg-indigo-600 text-white font-medium"onClick={toggle}>切换模式</button></div><div className="mb-2">点击按钮切换 isDarkMode 状态</div><divclassName="p-4 border rounded bg-opacity-60"style={{ background: isDarkMode ? "#222" : "#f9fafb" }}>isDarkMode:{" "}<spanclassName={`inline-block px-2 py-1 rounded font-mono ${isDarkMode ? "bg-green-700 text-white" : "bg-gray-200 text-gray-900"}`}>{isDarkMode ? "true" : "false"}</span></div></div>);
}

常用 Hook 速查表

Hook 名称主要用途
useToggle布尔/任意值切换
usePreviousValue获取前一个值
useObjectState对象状态管理
useValidatedState校验型状态
useEvent事件回调
useGlobalEvent全局事件监听
useWindowResize监听窗口尺寸变化
useDebouncedCallback防抖回调
useThrottledCallback节流回调
useDidMount组件挂载时执行
useWillUnmount组件卸载时执行
useLocalStorage本地存储状态
useOnlineState网络状态检测
useDarkMode深色模式切换

总结

beautiful-react-hooks 提供了丰富且实用的自定义 Hook,极大简化了 React 组件的开发。建议结合官方文档和 Playground 进行实践体验,快速掌握每个 Hook 的用法。

 beautiful-react-hooks库——入门实践常用hook详解 - 高质量源码分享平台-免费下载各类网站源码与模板及前沿动态资讯

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

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

相关文章

DOM 规范中的 MutationObserver 接口

MutationObserver 接口DOM规范中的 MutationObserver 接口可以在DOM被修改时异步执行回调。使用MutationObserver可以观察整个文档、DOM树的一部分或某个元素&#xff0c;元素属性、字节点、文本等。新引进的MutationObserver接口取代了已废弃的MutationEvent。MutationObserve…

3.7 小结

图3-7-1点云可视化点云可视化工具就像是打开点云数据宝藏大门的钥匙&#xff0c;能让我们直观地理解和分析这些复杂的数据。本章节&#xff0c;主要介绍了PCL、Open3D、Matplotlib、PCShow、VTK 这几种点云可视化工具。PCL&#xff08;Point Cloud Library&#xff09;是专注于…

对称二叉树、二叉树直径

101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 法一&#xff1a;递归。 对于两个对称位置的节点L和R&#xff08;L在左子树&#xff0c;R在右子树&#xff09;&#xff0c;只有当L的左节点值R的右节点值且L的右节点值R的左节点值时&#xff0c;这棵二叉树才有可能对…

Java多线程1

线程是操作系统能够运行调度的最小单位&#xff0c;它包含在进程之中&#xff0c;是进程的实际运作单位多线程有三种实现方式线程实现方法1&#xff0c;继承Thread类&#xff08;无返回值&#xff09;&#xff1a;1、继承Thread2、重写run方法&#xff08;线程要执行的代码&…

云计算如何提高企业的数据安全性和隐私保护

在企业数字化转型加速推进的今天&#xff0c;数据安全与隐私保护已成为决定企业生存发展的核心命题。云计算凭借其灵活的架构优势&#xff0c;不仅重塑了企业资源管理模式&#xff0c;更在数据安全防护领域构建起多层次保障体系。以下从六大维度解析云计算如何为企业数据安全与…

GaussDB 数据库架构师修炼(二)数据库计算容量评估

1 计算资源容量评估主要流程 一般地是经过以下5个流程评估GaussDB的计算容量: 2 TPC-C基准测试介绍 1)TPC-C是业界常用的一套Benchmark 由TPC (Transaction Processing Performance Council)委员会制定发布,用于 评测数据库的联机交易处理(偏向OLTP)能力,测试结果数据…

开源 python 应用 开发(六)网络爬虫

最近有个项目需要做视觉自动化处理的工具&#xff0c;最后选用的软件为python&#xff0c;刚好这个机会进行系统学习。短时间学习&#xff0c;需要快速开发&#xff0c;所以记录要点步骤&#xff0c;防止忘记。 链接&#xff1a; 开源 python 应用 开发&#xff08;一&#xf…

flink sql读hive catalog数据,将string类型的时间戳数据排序后写入kafka,如何保障写入kafka的数据是有序的

在 Flink SQL 中&#xff0c;要确保从 Hive 读取的 STRING 类型时间戳数据排序后有序写入 Kafka&#xff0c;需要结合 批处理模式、时间类型转换、单分区写入 和 Kafka 生产者配置。以下是完整解决方案&#xff1a; 一、核心解决方案 1. 批处理模式 全局排序 将作业设置为批处…

7.17 滑动窗口 |assign |memo

lcp56. memo优化tle或者改用bfsclass Solution {int m, n;int dx[4] {0, 0, 1, -1};int dy[4] {1, -1, 0, 0};public:int conveyorBelt(vector<string>& matrix, vector<int>& start, vector<int>& end) {int ret INT_MAX;m matrix.size();n…

统计功效是什么?

统计功效的通俗理解可以把“统计功效”想象成侦探破案的能力——它代表统计检验&#xff08;侦探&#xff09;在犯罪事实确实存在&#xff08;真实效应存在&#xff09;时&#xff0c;成功发现真相&#xff08;检测出效应&#xff09;的概率。核心比喻假设你是一个侦探&#xf…

大语言模型(LLM)训练的教师强制(Teacher Forcing)方法

大语言模型&#xff08;LLM&#xff09;在训练时使用一种名为“教师强制&#xff08;Teacher Forcing&#xff09;”的方法&#xff0c;而不是它们在推理&#xff08;生成文本&#xff09;时使用的“自回归&#xff08;Autoregressive&#xff09;”方法 。阐明关于LLM训练的一…

归一化与激活函数:深度学习的双引擎

归一化和激活函数区别 归一化和激活函数是深度学习中两个不同但又存在关联的技术,前者聚焦于“数据分布的调整”,后者聚焦于“引入非线性与输出转换”。 Softmax 既可以被视为一种归一化操作,也属于激活函数 因为它同时满足两者的核心特征,只是从不同角度定义:从“输出…

C# --- 单例类错误初始化 + 没有释放资源导致线程泄漏

C# --- 单例类错误初始化 没有释放资源导致线程泄漏Background原因分析问题一&#xff1a; 错误初始化&#xff08;使用了箭头函数&#xff09;问题一&#xff1a; 没有Dispose资源Background 背景: service A的其中一个Api会向mq发送消息问题&#xff1a;线上发现这个服务经常…

MySQL基础学习之DML,DQL(二)

这里写目录标题一、DML1、INSERT语句1)、给指定列添加数据2)、给全部列添加数据3)、批量数据添加数据4)、操作2、UPDATE语句3、DELETE语句二、DQL1、单表查询1&#xff09;查询语法2&#xff09;查询全部3&#xff09;查询部分4&#xff09;条件查询5&#xff09;聚合函数6&…

在 Linux 系统中实现 Spring Boot 程序自动启动的最佳实践

在实际部署 Spring Boot 项目的生产环境中&#xff0c;如何确保服务自动启动&#xff08;如开机自动运行、宕机自动恢复&#xff09;是一项基础而关键的运维能力。本文将系统介绍如何在 Linux 中将 Spring Boot 应用注册为 systemd 服务&#xff0c;实现进程守护与自动启动。&a…

如何建立项目团队的自驱力文化?

建立项目团队的自驱力文化&#xff0c;关键在于赋权机制、目标共创、持续反馈、内在激励、价值认同。 其中&#xff0c;“目标共创”尤其重要。项目成员若未参与目标制定&#xff0c;仅被动接受任务&#xff0c;将很难激发责任感和参与热情。反之&#xff0c;通过共创目标&…

【React Native】布局文件-底部TabBar

布局文件-底部tabBar 内容配置 export default function Layout() {return (<Tabs />); }默认会将布局文件是将与它在同一个目录的所有文件&#xff0c;包括下级目录的文件&#xff0c;全都配置成Tab了。&#xff1a; 这样做显然不对&#xff0c;正确的做法是 在app目…

CompareFace使用

CompareFace 使用 CompareFace 有三种服务&#xff0c;分别是人脸识别&#xff08;RECOGNITION&#xff09;、人脸验证&#xff08;VERIFICATION&#xff09;、人脸检测&#xff08;DETECTION&#xff09;。 人脸识别其实就是人脸身份识别(每张照片只有一个人脸)&#xff0c;…

APP测试之Monkey压力测试

&#xff08;一&#xff09;Monkey简介 Monkey意指猴子&#xff0c;顽皮淘气。所以Monkey测试&#xff0c;顾名思义也就像猴子一样在软件上乱敲按键&#xff0c;猴子什么都不懂&#xff0c;就爱捣乱。 Monkey 是 Android SDK 自带的命令行工具&#xff0c;它通过向系统发送伪…

时序大模型为时序数据库带来的变革与机遇

时序数据&#xff08;Time Series Data&#xff09;作为记录系统状态随时间变化的重要数据类型&#xff0c;在物联网、金融交易、工业监控等领域呈爆炸式增长。传统时序数据库专注于高效存储和查询时序数据&#xff0c;而时序大模型&#xff08;Time Series Foundation Models&…