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://www.pswp.cn/diannao/91589.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91589.shtml

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

相关文章

React强大且灵活hooks库——ahooks入门实践之副作用类hook(effect)详解

什么是 ahooks&#xff1f; ahooks 是一个 React Hooks 库&#xff0c;提供了大量实用的自定义 hooks&#xff0c;帮助开发者更高效地构建 React 应用。其中副作用类 hooks 是 ahooks 的一个重要分类&#xff0c;专门用于处理各种副作用操作&#xff0c;如定时器、防抖、节流等…

SpringBoot一Web Flux、函数式Web请求的使用、和传统注解@Controller + @RequestMapping的区别

一、函数式 Web 在 Spring Boot 中&#xff0c;使用函数式 Web&#xff08;Function-based Web&#xff09;可以通过 RouterFunction 和 HandlerFunction 来定义路由和请求处理逻辑。这种方式与传统的注解驱动的方式不同&#xff0c;它更加简洁&#xff0c;并且适合响应式编程。…

Vue+Cesium快速配置指南

安装必要依赖在项目根目录下运行以下命令安装vue-cesium和cesium&#xff1a;npm install vue-cesium3.1.4 cesium1.84配置Vite在vite.config.js文件中添加以下配置&#xff1a;import { defineConfig } from vite import vue from vitejs/plugin-vue import { resolve } from …

矿业自动化破壁者:EtherCAT转PROFIBUS DP网关的井下实战

在深井钻机的轰鸣、矿石输送带的奔流与通风设备的不息运转中&#xff0c;矿业生产的脉搏强劲跳动。然而&#xff0c;这片创造价值的土地&#xff0c;却为自动化技术的深入设置了严苛的考场&#xff1a;信息孤岛林立&#xff1a; 高效现代的EtherCAT控制系统与井下大量稳定服役的…

SpringBoot+Loki4j+Loki+Grafana搭建轻量级日志系统

文章目录前言一、组件介绍&#xff08;一&#xff09;Loki特点架构适用场景总结&#xff08;二&#xff09;Loki4j特点&#xff08;三&#xff09;Grafana特点适用场景二、组件配置&#xff08;一&#xff09;Loki&#xff08;二&#xff09;Grafana三、项目搭建参考文章前言 …

SpringCloud之Config

SpringCloud之Config 推荐网站&#xff1a;https://www.springcloud.cc/spring-cloud-dalston.html#_spring_cloud_config 1. 什么是 Spring Cloud Config Spring Cloud Config 是 Spring 官方提供的 分布式配置中心 组件&#xff0c;用来 集中管理、动态下发、版本控制 所有微…

探索VB.NET中的贝塞尔Bezier曲线绘制技巧

简介&#xff1a;Bezier曲线是计算机图形学中用于创建平滑曲线的重要工具&#xff0c;广泛应用于图形设计、游戏开发、CAD系统等领域。本文深入探讨了Bezier曲线的基础知识&#xff0c;并详细说明了如何在Visual Basic中使用 Graphics 对象的 DrawBezier 方法绘制曲线。通过理论…

分布式分片策略中,分片数量的评估与选择

分布式分片策略中,分片数量的评估与选择是影响系统性能、扩展性和运维成本的核心问题 一、分片数量评估方法论 1. ​​数据量基准模型​​ ​​单分片容量建议​​:根据Elasticsearch最佳实践,单个分片建议控制在10-50GB(冷数据可放宽至100GB),超过100GB会导致段合并效率…

Vue3高级特性:深入理解effectScope及其应用场景

系列文章目录 Vue3 组合式 API 进阶&#xff1a;深入解析 customRef 的设计哲学与实战技巧 Vue3 watchEffect 进阶使用指南&#xff1a;这些特性你可能不知道 Vue3高级特性&#xff1a;深入理解effectScope及其应用场景 文章目录系列文章目录前言一、核心概念1、什么是 effect…

Docker 中的动态配置:docker update 命令与环境变量管理

Docker 中的动态配置&#xff1a;docker update 命令与环境变量管理 在 Docker 容器的日常管理中&#xff0c;动态调整配置以适应业务需求变化是常见的操作。docker update 命令作为 Docker 平台的重要工具&#xff0c;为运行中的容器提供了便捷的配置调整方式&#xff0c;而环…

ELK 使用教程采集系统日志

作者&#xff1a;小凯 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01; 本文的宗旨在于通过易于上手实操的方式&#xff0c;教会读者完成系统ELK日志采集的对接和使用。那你知道对于一个系统的上线考察&#xff0c;必备的几样东西是什么吗&#xff1f;其实这…

小程序部分pai

wx.setClipboardData 这是微信小程序提供的 API&#xff0c;用于将数据复制到剪贴板。 Page({data: {clientInfo: {email: exampleexample.com // 假设的邮箱数据}},// 复制邮箱到剪贴板copyEmail: function() {wx.setClipboardData({data: this.data.clientInfo.email,success…

【解决方案】鸿蒙 / 矿鸿系统 Shell 无故退出问题(息屏导致)详解

平台环境 OpenHarmony 版本&#xff1a;4.1 release开发板&#xff1a;DAYU / RK3568调试工具&#xff1a;hdc 在使用 OpenHarmony 4.1 Release&#xff08;矿鸿系统&#xff09;进行开发时&#xff0c;遇到这样的问题&#xff1a; &#x1f6a8; Shell 会在一段时间后自动退出…

Data Analysis TTAD=>CNN-BiGRU-MSA

TTAO 预处理、CNN-BiGRU-MSA 模型 时序数据回归分析时序数据分析方法&#xff0c;特点&#xff1a;TTAO 预处理&#xff1a;通过三角拓扑结构增强时序特征的局部和全局关系混合模型架构&#xff1a;CNN 层提取局部特征模式BiGRU 捕获双向时序依赖多头自注意力机制进行序列建模…

python-字典、集合、序列切片、字符串操作(笔记)

一、字符串常见操作&#xff08;重点&#xff09;​1.​2.字符串无法修改#错误示范 str1"djskds" str1[2]"3"3.​str1"abcand" # 输出3 print(str1.index("and"))4.​str1"abcand" newStrstr1.replace("and",&quo…

【Android】EditText使用和监听

三三想成为安卓糕手 一&#xff1a;用户登录校验 1&#xff1a;EditText文本输入框<EditTextandroid:id"id/et_user_name"android:layout_width"match_parent"android:layout_height"wrap_content"android:inputType"number"androi…

SQL 中根据当前时间动态计算日期范围

在 SQL 中写“动态时间”通常是指根据当前时间动态计算日期范围&#xff0c;而不是写死固定日期。以下是几种常见写法&#xff08;以 SQL Server / MySQL / PostgreSQL 为例&#xff09;&#xff1a;1. 获取当前时间-- SQL Server SELECT GETDATE() AS now-- MySQL SELECT NOW(…

react-redux 类组件的 connect

store 目录下 store/reducer.js import * as actionTypes from ./constantsconst initalState {counter: 100,banners: [],recommends: [] }/*** 定义reducer函数&#xff1a;纯函数* param 参数一&#xff1a;store中目前保存的state* param 参数二&#xff1a;通过 dispatch…

数据分布是如何影响目标检测精度

文章目录一、研究背景与目标模型效果提升数据集优化二、研究问题明细各方向的关联性与核心逻辑1. 高质量数据集的高效筛选与主动学习应用2. 基于推理结果的数据补充与增强方向优化3. 多类别场景下目标尺度与模型精度的关联性4. 损失函数与数据增强对精度的量化影响5. 目标类型专…

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南 在AI大模型技术飞速发展的今天,企业需要将现有Java接口快速适配为模型计算协议(MCP,Model Calculation Protocol)服务,以便与大模型生态无缝对接。然而,手动逐个转换接口不仅耗时耗力,还容易因人为疏忽导致错误…