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

React强大且灵活hooks库——ahooks入门实践之开发调试类hook(dev)详解

什么是 ahooks?

ahooks 是一个 React Hooks 库,提供了大量实用的自定义 hooks,帮助开发者更高效地构建 React 应用。其中开发调试类 hooks 是 ahooks 的一个重要分类,专门用于开发调试阶段,帮助开发者追踪组件更新和副作用执行。

安装 ahooks

npm install ahooks

开发调试类 hooks 详解

useTrackedEffect – 追踪副作用

useTrackedEffect 用于追踪副作用的执行,帮助调试依赖项变化。

import React, { useState } from "react";
import { useTrackedEffect } from "ahooks";
import { Card, Button, Input } from "antd";const UseTrackedEffectExample = () => {const [count, setCount] = useState(0);const [name, setName] = useState("张三");useTrackedEffect((changes) => {console.log("副作用执行,变化详情:", changes);console.log("当前值 - count:", count, "name:", name);},[count, name],{onTrack: (changes) => {console.log("追踪到变化:", changes);},});return (<Card title="useTrackedEffect 追踪副作用"><div style={{ marginBottom: 16 }}><p><strong>计数:</strong> {count}</p><p><strong>姓名:</strong> {name}</p><p style={{ fontSize: "12px", color: "#666" }}>查看控制台了解副作用执行和依赖项变化</p></div><div style={{ marginBottom: 16 }}><Inputvalue={name}onChange={(e) => setName(e.target.value)}placeholder="输入姓名"style={{ marginBottom: 8 }}/></div><div><Button onClick={() => setCount(count + 1)} style={{ marginRight: 8 }}>增加计数</Button><Button onClick={() => setName("李四")}>改变姓名</Button></div></Card>);
};

useWhyDidYouUpdate – 组件更新原因

useWhyDidYouUpdate 用于追踪组件重新渲染的原因,帮助优化性能。

import React, { useState, memo } from "react";
import { useWhyDidYouUpdate } from "ahooks";
import { Card, Button } from "antd";// 使用 memo 包装组件以便追踪更新
const ExpensiveComponent = memo(({ count, name, onUpdate }) => {// 追踪组件更新原因useWhyDidYouUpdate("ExpensiveComponent", { count, name, onUpdate });return (<div style={{ padding: 16, backgroundColor: "#f0f0f0", borderRadius: 4 }}><p><strong>计数:</strong> {count}</p><p><strong>姓名:</strong> {name}</p><Button onClick={onUpdate}>更新</Button></div>);
});const UseWhyDidYouUpdateExample = () => {const [count, setCount] = useState(0);const [name, setName] = useState("张三");const [parentCount, setParentCount] = useState(0);const handleUpdate = () => {console.log("子组件更新按钮被点击");};return (<Card title="useWhyDidYouUpdate 组件更新原因"><div style={{ marginBottom: 16 }}><p><strong>父组件计数:</strong> {parentCount}</p><p style={{ fontSize: "12px", color: "#666" }}>查看控制台了解子组件重新渲染的原因</p></div><div style={{ marginBottom: 16 }}><ExpensiveComponent count={count} name={name} onUpdate={handleUpdate} /></div><div><Button onClick={() => setCount(count + 1)} style={{ marginRight: 8 }}>改变子组件计数</Button><Button onClick={() => setName("李四")} style={{ marginRight: 8 }}>改变子组件姓名</Button><Button onClick={() => setParentCount(parentCount + 1)}>改变父组件计数(不影响子组件)</Button></div></Card>);
};

开发调试 hooks 组合使用示例

import React, { useState, memo } from "react";
import { useTrackedEffect, useWhyDidYouUpdate } from "ahooks";
import { Card, Button, Input } from "antd";// 使用 memo 包装的组件
const DebugComponent = memo(({ data, onDataChange }) => {// 追踪组件更新原因useWhyDidYouUpdate("DebugComponent", { data, onDataChange });// 追踪副作用执行useTrackedEffect((changes) => {console.log("DebugComponent 副作用执行:", changes);},[data],{onTrack: (changes) => {console.log("DebugComponent 追踪变化:", changes);},});return (<div style={{ padding: 16, backgroundColor: "#f6ffed", borderRadius: 4 }}><p><strong>数据:</strong> {JSON.stringify(data)}</p><Button onClick={() => onDataChange({ ...data, count: data.count + 1 })}>更新数据</Button></div>);
});const DevToolsExample = () => {const [data, setData] = useState({ count: 0, name: "初始值" });const [parentState, setParentState] = useState(0);// 追踪父组件副作用useTrackedEffect((changes) => {console.log("父组件副作用执行:", changes);},[data, parentState],{onTrack: (changes) => {console.log("父组件追踪变化:", changes);},});return (<Card title="开发调试 hooks 组合使用"><div style={{ marginBottom: 16 }}><p><strong>父组件状态:</strong> {parentState}</p><p style={{ fontSize: "12px", color: "#666" }}>打开控制台查看详细的调试信息</p></div><div style={{ marginBottom: 16 }}><DebugComponent data={data} onDataChange={setData} /></div><div><ButtononClick={() => setData({ ...data, name: "新名称" })}style={{ marginRight: 8 }}>改变数据名称</Button><ButtononClick={() => setParentState(parentState + 1)}style={{ marginRight: 8 }}>改变父组件状态</Button><Button onClick={() => setData({ count: 0, name: "重置" })}>重置数据</Button></div></Card>);
};

开发调试类 hooks 速查表

Hook 名称用途描述
useTrackedEffect追踪副作用追踪副作用的执行和依赖项变化
useWhyDidYouUpdate组件更新原因追踪组件重新渲染的原因,帮助性能优化

 React强大且灵活hooks库——ahooks入门实践之开发调试类hook(dev)详解 - 高质量源码分享平台-免费下载各类网站源码与模板及前沿动态资讯


文章转载自:
http://bacca.jopebe.cn
http://antinational.jopebe.cn
http://antrorsely.jopebe.cn
http://burrow.jopebe.cn
http://additament.jopebe.cn
http://adamsite.jopebe.cn
http://boresome.jopebe.cn
http://achromobacter.jopebe.cn
http://cardioscope.jopebe.cn
http://cataract.jopebe.cn
http://acidoid.jopebe.cn
http://beggarhood.jopebe.cn
http://bmc.jopebe.cn
http://acrodromous.jopebe.cn
http://canard.jopebe.cn
http://chalkstone.jopebe.cn
http://birdcage.jopebe.cn
http://chestertonian.jopebe.cn
http://burnoose.jopebe.cn
http://burletta.jopebe.cn
http://chatoyant.jopebe.cn
http://amortize.jopebe.cn
http://chessboard.jopebe.cn
http://aralia.jopebe.cn
http://aeroflot.jopebe.cn
http://aerophotography.jopebe.cn
http://brickmason.jopebe.cn
http://bushy.jopebe.cn
http://bossdom.jopebe.cn
http://chink.jopebe.cn
http://www.dtcms.com/a/280632.html

相关文章:

  • PostgreSQL 数据库中 ETL 操作的实战技巧
  • React源码6 三大核心模块之一:commit, finishConcurrentRender函数
  • 前端学习笔记:React.js中state和props的区别和联系
  • haproxy负载均衡
  • AntV G6 基础元素详解(React版)
  • 【PTA数据结构 | C语言版】创建哈夫曼树
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第二十一讲)
  • 【PDF识别改名】使用京东云OCR完成PDF图片识别改名,根据PDF图片内容批量改名详细步骤和解决方案
  • 同样是“跳转”,为何forward地址栏不变,redirect会变?
  • RNN、GRU 与 LSTM 计算成本深入对比
  • 基于光场相机的激光增材制造熔池温度场原位多眼监测​​
  • 【zynq7020】PL的“Hello LED”
  • FPGA高端图像ISP培训课程,提供工程源码+视频教程+FPGA开发板
  • Softhub软件下载站实战开发(十八):软件分类展示
  • 使用LNMP一键安装包安装PHP、Nginx、Redis、Swoole、OPcache
  • Vmware中安装的CentOS7如何扩展硬盘大小
  • 语言模型玩转3D生成:LLaMA-Mesh开源项目
  • 【鸿蒙HarmonyOS】鸿蒙app开发入门到实战教程(二):封装自定义可复用组件
  • 前端面试专栏-工程化:25.项目亮点与技术难点梳理
  • 手搓RAG
  • 知识增强型Agent开发新范式:基于ERNIE-4.5的检索增强生成架构实践
  • 力扣-使用双指针的方法的题们(持续更新中。。。
  • NipaPlay(视频播放器) v1.3.24 绿色版
  • ubuntu22.04谷歌浏览器中文输入法bug
  • 非实时的防控场景
  • 其他常见 HTTP 方法
  • redisson 设置了过期时间,会自动续期吗
  • 论文略读:QM-ARC: QoS-aware Multi-tier Adaptive Cache Replacement Strategy
  • 2025华为ODB卷-任务总执行时长-三语言题解
  • 图灵在二战期间是如何破译德国军用密码的?