React-Hook

news2025/4/27 10:11:36

一、基础 Hooks

1、useState - 状态管理

        useState 是 React 提供的一个函数,用来在函数组件中声明和修改状态,没有它,函数组件只是一个“静态模板”;有了它,函数组件可以保存和更新数据(比如计数器数值、输入框内容)

import { useState } from 'react';
 
function Counter() {
  // 1. 声明一个状态变量 count,初始值为 0
  // 2. setCount 是修改 count 的专用函数
  const [count, setCount] = useState(0);
 
  return (
    <div>
      <p>当前计数:{count}</p>
      {/* 点击按钮时,调用 setCount 修改 count 的值 */}
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
}

2、useEffect - 副作用处理

        Effect Hook 可以让我们在函数组件中执行副作用操作。当我们在 React 更新 DOM 之后想运行一些额外的代码,比如发送网络请求、手动变更 DOM,记录日志可以使用Effect Hook,可以把 useEffect看做 componentDidMount,componentDidUpdate 的结合

        基本结构:

useEffect(() => {
  // 副作用逻辑(如发送请求、操作 DOM)

  return () => {
    // 清理函数(如取消订阅、移除事件监听、关闭定时器)
  };
}, [依赖数组]); // 控制副作用何时执行
        三种常见用法:

(1)依赖数组为空,只在组件初始时执行一次(类似 componentDidMount

useEffect(() => {
  console.log('组件加载完成!');
  fetch('https://api.example.com/data') // 发送请求
    .then(response => response.json())
    .then(data => console.log(data));
 
  return () => {
    console.log('组件卸载时会执行这里!');
  };
}, []); // 依赖数组为空,表示不依赖任何变量,只执行一次

(2)传入特定依赖项,初始+依赖项变化时执行(类似 componentDidUpdate

const [userId, setUserId] = useState(1);
 
useEffect(() => {
  console.log('userId 变化时重新请求数据');
  fetch(`https://api.example.com/users/${userId}`)
    .then(response => response.json())
    .then(data => console.log(data));
}, [userId]); // 当 userId 变化时,重新执行副作用

(3)没有依赖项,初始+每次渲染后执行

useEffect(() => {
  console.log('每次渲染后都会执行!');
}); // 没有依赖数组,每次渲染后都执行

        清除副作用:在useEffect中编写的由渲染本身引起的对接组件外部的操作,社区也经常把它叫做副作用操作,比如在useEffect中开启了一个定时器,我们想在组件卸载时把这个定时器再清理掉,这个过程就是清理副作用,该函数会在组件卸载时自动执行

import { useState, useEffect } from 'react';
function App() {
  const [show, setShow] = useState(true)
  return (
    <div className="App">
      {show && <Son />}
      <button onClick={() => setShow(false)}>卸载Son组件</button>
    </div>
  );
}

function Son() {
  useEffect(() => {
    const timer = setInterval(() => {
      console.log('定时器运行中');
    }, 1000)
    return () => {
      clearInterval(timer) // 组件卸载时自动执行
    }
  }, [])
  return (
    <div>this is son</div>
  )
}

二、自定义Hooks

        自定义Hook是以 use 打头的函数,通过自定义Hook函数可以用来实现逻辑的封装和复用

        不使用自定义hooks实现点击按钮切换组件显示:

function App() {
  const [value, setValue] = useState(true)
  const toggle = () => {
    setValue(!value)
  }
  return (
    <div className="App">
      <button onClick={toggle}>toggle</button>
      {value && <div>this is div</div>}
    </div>
  );
}

      使用自定义hooks实现点击按钮切换组件显示:

function App() {
  // const [value, setValue] = useState(true)
  // const toggle = () => {
  //   setValue(!value)
  // }
  const {value, toggle} = useToggle()
  return (
    <div className="App">
      <button onClick={toggle}>toggle</button>
      {value && <div>this is div</div>}
    </div>
  );
}

// 自定义hooks
function useToggle() {
  // 可复用的逻辑代码
  const [value, setValue] = useState(true)
  const toggle = () => {
    setValue(!value)
  }
  // 哪些状态和回调函数需要在其他组件中使用,就return
  return {
    value,
    toggle
  }
}

三、Hooks规则

  • 只在 React 函数组件或自定义 Hooks 的顶层调用
  • 不可在条件语句或循环中使用 Hooks

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

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

相关文章

【物联网】基于LORA组网的远程环境监测系统设计(机智云版)

基于LORA组网的远程环境监测系统设计(机智云版) 演示视频: 简介: 1.本系统有一个主机,两个从机。 2.一主多从的LORA组网通信,主机和两个从机都配备了STM32F103单片机与 LoRa 模块,主机作为中心设备及WIFI网关,负责接收和发送数据到远程物联网平台和手机APP,两个从机…

制作一款打飞机游戏22:表格导出

编辑器功能扩展 今天&#xff0c;我想让编辑器能够处理一个数组&#xff0c;这是编辑器将要编辑的东西&#xff0c;它只编辑数组。这些区域在后续的不同版本的编辑器中会有不同的含义&#xff0c;但现在我想创建一个模板&#xff0c;能够加载一个二维数组&#xff0c;并将二维…

Linux内核源码结构

目录 Linux内核源码结构 Linux内核版本命名 Linux内核版本选择 内核源码结构 arch&#xff1a;与CPU架构相关的源代码 block:磁盘设备的支持 COPYING文件 CREDITS文件 crypto:加密相关 Documentation: drivers:设备驱动 firmware:固件 fs:文件系统 include:头文件…

72.评论日记

【巫师】中美关税战02&#xff1a;应给人民爆装备&#xff0c;以及普通人如何应对(7条建议)_哔哩哔哩_bilibili 2025年4月26日11:03:31

Websocket自动发送消息客户端工具

点击下载《Websocket自动发送消息客户端工具》 1. 前言 在现代网络应用中&#xff0c;实时通信和即时数据传输变得越来越重要。WebSocket作为一种全双工通信协议&#xff0c;因其高效、实时的特点&#xff0c;被广泛应用于聊天应用、实时数据监控、在线游戏等领域。然而&…

STM32的开发环境介绍

目录 STM32软件环境 Keil软件在线安装 其他软件环境安装 STM32开发的几种方式 STM32寄存器版本和库函数版本 标准外设库的作用&#xff1a; STM32软件环境 STM32 的集成开发环境&#xff08;IDE&#xff09;&#xff1a;编辑编译软件 常见的环境&#xff1a; (1)KEIL&a…

数据库系统概论(四)关系操作,关系完整性与关系代数

数据库系统概论&#xff08;四&#xff09;详细讲解关系操作&#xff0c;关系完整性与关系代数 前言一、什么是关系操作1.1 基本的关系操作1.2 关系数据语言的分类有哪些 二、关系的完整性2.1 实体完整性2.2 参照完整性2.3 用户的定义完整性 三、关系代数是什么3.1 传统的集合运…

基于 IPMI + Kickstart + Jenkins 的 OS 自动化安装

Author&#xff1a;Arsen Date&#xff1a;2025/04/26 目录 环境要求实现步骤自定义 ISO安装 ipmitool安装 NFS定义 ks.cfg安装 HTTP编写 Pipeline 功能验证 环境要求 目标服务器支持 IPMI / Redfish 远程管理&#xff08;如 DELL iDRAC、HPE iLO、华为 iBMC&#xff09;&…

使用 Node、Express 和 MongoDB 构建一个项目工程

本文将详细介绍如何使用 Node.js Express MongoDB 构建一个完整的 RESTful API 后端项目&#xff0c;涵盖&#xff1a; 项目初始化 Express 服务器搭建 MongoDB 数据库连接 REST API 设计&#xff08;CRUD 操作&#xff09; 错误处理与中间件 源码结构与完整代码 部署建…

【C++11】右值引用和移动语义:万字总结

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲右值引用和移动语义 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;C学习笔记 &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C语言入门基础&#xff0c;python入门基…

Python基于Django的全国二手房可视化分析系统【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

VulnHub-DC-2靶机渗透教程

VulnHub-DC-2靶机渗透教程 1.靶机部署 [Onepanda] Mik1ysomething 靶机下载&#xff1a;https://download.vulnhub.com/dc/DC-2.zip 直接使用VMware导入打开就行 2.信息收集 2.1 获取靶机ip(arp-scan/nmap) arp-scan -l ​ nmap 192.168.135.0/24 2.2 详细信息扫描(nmap)…

n8n 中文系列教程_10. 解析n8n中的AI节点:从基础使用到高级Agent开发

在自动化工作流中集成AI能力已成为提升效率的关键。n8n通过内置的LangChain节点&#xff0c;让开发者无需复杂代码即可快速接入GPT-4、Claude等大模型&#xff0c;实现文本处理、智能决策等高级功能。本文将深入解析n8n的AI节点体系&#xff0c;从基础的Basic LLM Chain到强大的…

计算机网络 | 应用层(1)--应用层协议原理

&#x1f493;个人主页&#xff1a;mooridy &#x1f493;专栏地址&#xff1a;《计算机网络&#xff1a;自定向下方法》 大纲式阅读笔记 关注我&#x1f339;&#xff0c;和我一起学习更多计算机的知识 &#x1f51d;&#x1f51d;&#x1f51d; 目录 1. 应用层协议原理 1.1 …

MuJoCo 关节角速度记录与可视化,监控机械臂运动状态

视频讲解&#xff1a; MuJoCo 关节角速度记录与可视化&#xff0c;监控机械臂运动状态 代码仓库&#xff1a;GitHub - LitchiCheng/mujoco-learning 关节空间的轨迹优化&#xff0c;实际上是对于角速度起到加减速规划的控制&#xff0c;故一般来说具有该效果的速度变化会显得丝…

LVGL模拟器:NXP GUIDER+VSCODE

1. 下载安装包 NXP GUIDER&#xff1a;GUI Guider | NXP 半导体 CMAKE&#xff1a;Download CMake MINGW&#xff1a;https://github.com/niXman/mingw-builds-binaries/releases SDL2&#xff1a;https://github.com/libsdl-org/SDL/releases/tag/release-2.30.8 VSCODE&…

《USB技术应用与开发》第四讲:实现USB鼠标

一、标准鼠标分析 1.1简介 1.2页面显示 其中页面显示的“”不用管它&#xff0c;因为鼠标作为物理抓包&#xff0c;里面有时候会抓到一些错误&#xff0c;不一定是真正的通讯错误&#xff0c;很可能是本身线路接触质量不好等原因才打印出来的“”。 1.3按下鼠标左键 &#x…

一、鸿蒙编译篇

一、下载源码和编译 https://blog.csdn.net/xusiwei1236/article/details/142675221 https://blog.csdn.net/xiaolizibie/article/details/146375750 https://forums.openharmony.cn/forum.php?modviewthread&tid897 repo init -u https://gitee.com/openharmony/mani…

得物业务参数配置中心架构综述

一、背景 现状与痛点 在目前互联网飞速发展的今天&#xff0c;企业对用人的要求越来越高&#xff0c;尤其是后端的开发同学大部分精力都要投入在对复杂需求的处理&#xff0c;以及代码架构&#xff0c;稳定性的工作中&#xff0c;在对比下&#xff0c;简单且重复的CRUD就显得…

【算法】单词搜索、最短距离

单词搜索 这道题主要考察了深度优先遍历(DFS)算法。 我们通过几个简单例子来分析一些细节问题&#xff1a; 1. 要搜索的单词串&#xff1a;abc 搜索的过程中必须按照字母顺序&#xff0c;首先从矩阵中的第一个元素开始搜索&#xff0c;遇到字母a则开始深度优先遍历&#xff0…