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

React强大且灵活hooks库——ahooks入门实践之生命周期类hook(lifecycle)详解

什么是 ahooks?

ahooks 是一个 React Hooks 库,提供了大量实用的自定义 hooks,帮助开发者更高效地构建 React 应用。其中生命周期类 hooks 是 ahooks 的一个重要分类,专门用于处理组件的生命周期事件。

安装 ahooks

npm install ahooks

生命周期类 hooks 详解

useMount – 组件挂载

useMount 用于在组件挂载时执行副作用操作,类似于 useEffect 的空依赖数组。

import React, { useState } from "react";
import { useMount } from "ahooks";
import { Card, Button, List, message } from "antd";const UseMountExample = () => {const [data, setData] = useState([]);const [loading, setLoading] = useState(false);useMount(() => {console.log("组件已挂载,开始初始化数据...");fetchInitialData();});const fetchInitialData = async () => {setLoading(true);try {// 模拟API调用await new Promise((resolve) => setTimeout(resolve, 1000));const mockData = [{ id: 1, name: "张三", email: "zhangsan@example.com" },{ id: 2, name: "李四", email: "lisi@example.com" },{ id: 3, name: "王五", email: "wangwu@example.com" },];setData(mockData);message.success("数据加载完成");} catch (error) {message.error("数据加载失败");console.error("数据加载错误:", error);} finally {setLoading(false);}};const handleRefresh = () => {fetchInitialData();};return (<div><Card title="useMount 组件挂载示例" style={{ marginBottom: 16 }}><div style={{ marginBottom: 16 }}><Button type="primary" onClick={handleRefresh} loading={loading}>刷新数据</Button><span style={{ marginLeft: 8, color: "#666" }}>组件挂载时会自动加载数据</span></div><Listloading={loading}dataSource={data}renderItem={(item) => (<List.Item><List.Item.Meta title={item.name} description={item.email} /></List.Item>)}/></Card><Card title="useMount 使用场景" size="small"><ul><li>组件初始化时获取数据</li><li>设置全局事件监听器</li><li>初始化第三方库</li><li>执行一次性的副作用操作</li></ul></Card></div>);
};export default UseMountExample;

useUnmount – 组件卸载

useUnmount 用于在组件卸载时执行清理操作,类似于 useEffect 的清理函数。

import React, { useState } from "react";
import { useUnmount } from "ahooks";
import { Card, Button, message, Alert } from "antd";const UseUnmountExample = () => {const [isVisible, setIsVisible] = useState(true);const [eventCount, setEventCount] = useState(0);// 模拟全局事件监听器const handleGlobalClick = () => {setEventCount((prev) => prev + 1);};// 组件卸载时清理事件监听器useUnmount(() => {console.log("组件即将卸载,清理事件监听器...");document.removeEventListener("click", handleGlobalClick);message.info("组件已卸载,事件监听器已清理");});// 添加事件监听器React.useEffect(() => {document.addEventListener("click", handleGlobalClick);console.log("事件监听器已添加");}, []);const handleToggleVisibility = () => {setIsVisible(!isVisible);};return (<div><Card title="useUnmount 组件卸载示例" style={{ marginBottom: 16 }}><div style={{ marginBottom: 16 }}><Button type="primary" onClick={handleToggleVisibility}>{isVisible ? "隐藏组件" : "显示组件"}</Button></div>{isVisible && (<div><Alertmessage="组件已挂载"description="点击页面任意位置会增加计数,组件卸载时会清理事件监听器"type="success"showIconstyle={{ marginBottom: 16 }}/><Card title="事件统计" size="small"><p><strong>全局点击次数:</strong> {eventCount}</p><p style={{ color: "#666", fontSize: "12px" }}>点击"隐藏组件"按钮来触发组件卸载,观察控制台输出</p></Card></div>)}</Card><Card title="useUnmount 使用场景" size="small"><ul><li>清理事件监听器</li><li>取消网络请求</li><li>清理定时器</li><li>保存用户数据</li><li>清理第三方库实例</li></ul></Card></div>);
};export default UseUnmountExample;

useUnmountedRef – 组件卸载状态引用

useUnmountedRef 返回一个 ref,用于判断组件是否已经卸载,避免在组件卸载后执行异步操作。

import React, { useState } from "react";
import { useUnmountedRef } from "ahooks";
import { Card, Button, List, message, Tag } from "antd";const UseUnmountedRefExample = () => {const [data, setData] = useState([]);const [loading, setLoading] = useState(false);const [requestCount, setRequestCount] = useState(0);const unmountedRef = useUnmountedRef();const fetchData = async (requestId) => {setLoading(true);setRequestCount((prev) => prev + 1);try {// 模拟异步请求await new Promise((resolve) => setTimeout(resolve, 2000));// 检查组件是否已卸载if (unmountedRef.current) {console.log(`请求 ${requestId} 完成,但组件已卸载,不更新状态`);return;}const mockData = Array.from({ length: 5 }, (_, index) => ({id: Date.now() + index,name: `用户 ${requestId}-${index + 1}`,email: `user${requestId}-${index + 1}@example.com`,timestamp: new Date().toLocaleTimeString(),}));setData(mockData);message.success(`请求 ${requestId} 完成`);console.log(`请求 ${requestId} 完成,组件状态已更新`);} catch (error) {if (!unmountedRef.current) {message.error(`请求 ${requestId} 失败`);console.error(`请求 ${requestId} 错误:`, error);}} finally {if (!unmountedRef.current) {setLoading(false);}}};const handleStartRequest = () => {const requestId = Date.now();fetchData(requestId);};const handleUnmount = () => {// 模拟组件卸载console.log("模拟组件卸载...");// 在实际应用中,这里会触发组件的卸载};return (<div><Cardtitle="useUnmountedRef 卸载状态检测示例"style={{ marginBottom: 16 }}><div style={{ marginBottom: 16 }}><Buttontype="primary"onClick={handleStartRequest}loading={loading}style={{ marginRight: 8 }}>发起异步请求</Button><Button onClick={handleUnmount}>模拟卸载</Button></div><div style={{ marginBottom: 16 }}><Tag color="blue">请求次数: {requestCount}</Tag><Tag color={loading ? "orange" : "green"}>状态: {loading ? "加载中" : "空闲"}</Tag></div><ListdataSource={data}renderItem={(item) => (<List.Item><List.Item.Metatitle={item.name}description={<div><div>{item.email}</div><div style={{ fontSize: "12px", color: "#666" }}>创建时间: {item.timestamp}</div></div>}/></List.Item>)}/></Card><Cardtitle="useUnmountedRef 使用场景"size="small"style={{ marginBottom: 16 }}><ul><li>防止内存泄漏</li><li>避免在组件卸载后更新状态</li><li>取消异步操作</li><li>清理定时器</li><li>处理竞态条件</li></ul></Card></div>);
};export default UseUnmountedRefExample;

生命周期类 hooks 速查表

Hook 名称用途描述
useMount组件挂载在组件挂载时执行副作用操作,类似于 useEffect 的空依赖数组
useUnmount组件卸载在组件卸载时执行清理操作,类似于 useEffect 的清理函数
useUnmountedRef卸载状态检测返回一个 ref,用于判断组件是否已经卸载,避免在组件卸载后执行异步操作

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

http://www.dtcms.com/a/277414.html

相关文章:

  • vite---环境变量和模式配置(.env 文件)
  • 【论文阅读】Think Only When You Need with Large Hybrid-Reasoning Models
  • Linux进程状态实战指南:转换关系、监控命令与状态解析
  • 【Linux | 网络】应用层(HTTP)
  • html-input 系列
  • 二进制、八进制、十进制、十六进制的转换
  • 用 Node.js 构建模块化的 CLI 脚手架工具,从 GitHub 下载远程模板
  • HarmonyOS-ArkUI Web控件基础铺垫1-HTTP协议-数据包内容
  • 【基于开源大模型(如deepseek)开发应用及其发展趋势的一点思考】
  • 早期 CNN 的经典模型—卷积神经网络(LeNet)
  • 在Linux文件写入软件设计中,直接写入SSD时磁盘写入抖动(I/O延迟波动)的解决方案
  • [CH582M入门第六步]软件IIC驱动AHT10
  • Leetcode 3613. Minimize Maximum Component Cost
  • Vue文件上传实战指南
  • 深入理解 Linux 文件系统层级结构
  • Python 数据挖掘之数据探索
  • CCS-MSPM0G3507-7-模块篇-MPU6050的基本使用
  • Spring Boot 安全登录系统:前后端分离实现
  • MYSQL笔记1
  • 黑马点评系列问题之p63unlock.lua不知道怎么整
  • 嵌入式单片机开发 - Keil MDK 自定义 Output 与 Listing 输出
  • EtherCAT开源主站 SOEM 2.0 最新源码在嵌入式 Linux 下的移植与编译
  • 2025.7.13总结
  • 欧拉系统安装UKUI桌面环境
  • 无缝衔接直播流体验
  • Git Commit Message写错后如何修改?已Push的提交如何安全修复?
  • C#单例模式管理全局变量
  • 格密码–SIS问题,ISIS问题及nf-ISIS问题
  • linux中at命令的常用用法。
  • 基于关联规则优化的个性化推荐系统