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

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.lryc.cn/news/590559.html

相关文章:

  • React之旅-09 useMemo,优化计算性能的利器
  • React 源码7:Lane、React和schedule优先级转换
  • WPF 多窗口分文件实现方案
  • 【MAC】nacos 2.5.1容器docker安装
  • QT——事件系统详解
  • 多语言json文件内\n换行不生效问题
  • React -自定义hooks - 封装双向数据绑定
  • React 中 props 的最常用用法精选+useContext
  • H3CNE综合实验之机器人
  • Antd中使用Table集成 react-resizable实现可伸缩列
  • PowerJob集群机器数为0问题
  • 深度剖析 TDMQ RabbitMQ 版经典队列底层存储机制
  • vue页面不销毁的情况下再返回,总是执行created,而不触发 activated
  • QOpenGLWidget自定义控件— 2D点云显示(支持平移、放缩、绘制网格)
  • SpringBoot集成Minio存储文件,开发图片上传等接口
  • 【c++深入系列】:万字详解list(附模拟实现的list源码)
  • 【Fedora 42】Linux内核升级后,鼠标滚轮失灵,libinput的锅?
  • 开源 python 应用 开发(六)网络爬虫
  • ubuntu中拷贝docker容器中的文件到宿主机
  • IKE学习笔记
  • K8s 自定义调度器 Part1:通过 Scheduler Extender 实现自定义调度逻辑
  • AI产品经理面试宝典第28天:自动驾驶与智慧交通融合面试题与答法
  • Xshell 7.0.0111p.exe 下载安装教程 - 详细步骤指南(包含安装包)
  • Kotlin获取集合中的元素操作
  • Kotlin比较接口
  • 《工程伦理》分析报告二 无人驾驶
  • 利用pdfjs实现的pdf预览简单demo(包含翻页功能)
  • 用AI做带货视频评论分析进阶提分【Datawhale AI 夏令营】
  • Windows11怎样禁止应用开机启动
  • pytorch | minist手写数据集