React hook1:useEffect

在编程中,副作用是指函数或表达式在执行过程中对外部环境产生影响的行为。例如:

  • 修改外部变量(如全局变量、DOM、API 请求、设置定时器等)

什么是纯函数?

// 纯函数:输入相同,输出必定相同,不影响外部
function add(a, b) {return a + b; 
}
//有副作用的函数:影响外部状态
function updateDOM() {document.title = "Changed!"; //副作用:修改DOM
}

React 推崇函数式编程,核心思想是:

  • 组件应该是纯函数(给定相同的props和state,渲染相同的 UI)
  • 副作用应该被隔离,不能直接在渲染过程中执行

React 如何处理副作用?渲染和外部处理相分离。
由于渲染必须是纯的,React 提供了useEffect 让副作用在渲染完成后执行,而不是在渲染期间执行。

useEffect是 React 提供的副作用隔离机制,让不纯的操作(如API请求、DOM修改)不影响组件的纯渲染逻辑,同时提供清理和优化能力。

  1. 保持渲染纯净(在组件渲染到屏幕之后运行)
  2. 避免阻塞渲染
  3. 自动清理副作用(可以返回一个清理函数,在组件卸载时执行)
react jsx title="useEffect基础用法"
import { useEffect } from 'react';function Example() {useEffect(() => {console.log('组件首次渲染后执行');}, []); // 空依赖数组表示只运行一次return <div>组件内容</div>;
}
react jsx title="useEffect引入依赖项监听变化"
function Example({ id }) {useEffect(() => {console.log('id 变化时执行:', id);}, [id]); // 仅在 id 变化时重新执行return <div>ID: {id}</div>;
}
react jsx title="useEffect清理副作用"
function Example() {useEffect(() => {const timer = setInterval(() => {console.log('定时器运行中...');}, 1000);return () => {clearInterval(timer); // 组件卸载时清理定时器};}, []);return <div>查看控制台</div>;
}

React hook2:useRef

useRef用于直接操作 DOM或存储可变值(不会触发重新渲染)。

用法1:操作DOM

import { useRef } from 'react';function InputFocus() {const inputRef = useRef(null); // 1. 创建 refconst handleClick = () => {inputRef.current.focus(); // 3. 通过 .current 操作 DOM};return (<div>{/* 2. 绑定 ref 到元素 */}<input ref={inputRef} type="text" /><button onClick={handleClick}>聚焦输入框</button></div>);
}

用法2:存储可变值,不触发重新渲染

import { useRef, useState } from 'react';function Counter() {const [count, setCount] = useState(0);const renderCount = useRef(0); // 存储组件渲染次数(不会触发更新)renderCount.current += 1; // 修改值(不会导致重新渲染)return (<div><p>Count: {count}</p><p>组件渲染次数: {renderCount.current}</p><button onClick={() => setCount(count + 1)}>增加</button></div>);
}

useRef的底层机制

// 近似实现(React 内部简化逻辑)
function useRef(initialValue) {return { current: initialValue }; // 每次都返回同一个对象!
}
  • 存储原理:React 在组件首次渲染时创建这个{ current: … }对象,后续所有渲染都返回同一个对象(引用不变)。
  • 修改current:直接修改current属性不会触发渲染,因为对象本身的引用没变,React 不会检测到变化。

为什么操作 DOM 需要绑定到标签?

<input ref={inputRef} /> 

React 的隐藏逻辑:当ref属性绑定到 DOM 标签时,React 会在渲染结束后自动将 DOM 节点赋值给inputRef.current。

// React 内部类似这样处理
const domNode = document.createElement('input');
inputRef.current = domNode; // 自动填充 DOM 节点

存储变量为何不需要绑定?

const renderCount = useRef(0);
renderCount.current += 1; // 直接修改即可

存储变量时,current只是一个普通属性,你可以自由读写,React 不会干涉它的值。

关键区别总结

场景是否需要绑定到标签current的值来源
操作 DOM需要由 React 自动填充为 DOM 节点
存储可变值不需要由开发者手动赋值/修改

React hook3:useMemo

useMemo用于缓存计算结果,只有当依赖项变化时才重新计算,避免重复渲染时不必要的计算开销。

function UserList({ users, searchTerm }) {// 缓存过滤后的用户列表,只有当users或searchTerm变化时才重新过滤const filteredUsers = useMemo(() => {return users.filter(user => user.name.toLowerCase().includes(searchTerm.toLowerCase()));}, [users, searchTerm]);return (<ul>{filteredUsers.map(user => (<li key={user.id}>{user.name}</li>))}</ul>);
}

React hook4:useNavigate

**useNavigate 就像一个提供多种导航工具的“工具箱”,可以从中选择需要的功能来完成路由跳转、前进/后退、传递数据等操作。**用“工具箱”类比 useNavigate:

工具箱里的工具对应 useNavigate 的功能
导航地图navigate(‘/path’) —— 直接跳转到指定路径。
橡皮擦navigate(‘/path’, { replace: true }) —— 替换当前路由(擦掉当前记录,不保留历史)。
时间机器按钮navigate(1) 或 navigate(-1) —— 前进或后退到历史记录中的页面。
快递包裹navigate(‘/path’, { state: { data } }) —— 跳转时携带隐藏数据(偷偷塞个包裹给下个页面)。

React hook5:useParams()

useParams从当前 URL 路径中提取参数。

示例代码:

<Route path="/user/:id" element={<UserProfile />} />
import { useParams } from 'react-router-dom';function UserProfile() {// 提取 URL 中的动态参数(比如 :id)const params = useParams();console.log(params.id); // 访问 /user/123 时,输出 "123"return <h1>用户ID: {params.id}</h1>;
}

当用户访问 /user/123 时,useParams() 会提取出 { id: ‘123’ }。

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

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

相关文章

关联规则挖掘1:Apriori算法

目录 一、Apriori算法核心原理 1. 基本概念 2. Apriori性质 二、完整案例计算&#xff08;超市购物数据&#xff09; ​步骤1&#xff1a;按字母序重排每笔交易​ ​步骤2&#xff1a;统计频繁1-项集&#xff08;min_support40%&#xff09;​​ ​步骤3&#xff1a;生成…

基于 C++ 线程池的多线程目标检测后处理系统设计与实现

在实际的智能视频分析系统中,目标检测(如 YOLOv5)只是第一步。检测结果往往需要进行后续处理:画框、报警、推流、日志记录等。这些操作如果在检测主线程中同步执行,会严重拖慢整体推理速度。 本文将带你从零实现一个基于 C++ 模板线程池的异步后处理系统,实现“检测与后…

Java并发容器详解

1. JUC并发容器概述 Java集合容器框架主要有四大类别&#xff1a;List、Set、Queue、Map。常见的ArrayList、LinkedList、HashMap等容器都是非线程安全的。 Java提供了同步容器&#xff08;如Vector、Hashtable、SynchronizedList&#xff09;通过synchronized实现同步&#xf…

SpringAI系列---【SpringA集成OllamaI如何先调用向量库,再把查到的结果一起传给大模型?】

SpringAI如何先调用向量库&#xff0c;再把查到的结果一起传给大模型&#xff1f; 1.引入pom <dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></depend…

告别“测试滞后”:AI实时测试工具在敏捷开发中的落地经验

告别“测试滞后”&#xff1a;AI实时测试工具在敏捷开发中的落地经验 在敏捷开发的“快速迭代”节奏中&#xff0c;测试环节常常成为“拖后腿”的短板。某互联网公司的敏捷团队曾陷入这样的循环&#xff1a;2周迭代周期中&#xff0c;开发用10天完成功能&#xff0c;留给测试的…

K8S-Pod资源对象

一、K8S架构与组件1、K8S架构k8s 总体架构采用了经典的 maste/slave 架构模式&#xff0c;分 master 节点和 worker 节点&#xff0c;节点可以是虚拟机也可以是物理机。K8S组件 master 节点组件Kube-apiserver 用于暴露 Kubernetes API&#xff0c;任何资源请求或调用操作都是通…

PyTorch API 5

文章目录torch.compiler延伸阅读torch.fft快速傅里叶变换辅助函数torch.func什么是可组合的函数变换&#xff1f;为什么需要可组合的函数变换&#xff1f;延伸阅读torch.futurestorch.fx概述编写转换函数图结构快速入门图操作直接操作计算图使用 replace_pattern() 进行子图重写…

基于决策树模型的汽车价格预测分析

一、整体流程概览这份代码实现了一个完整的机器学习预测流程&#xff0c;核心目标是通过汽车的各项特征预测其价格。整体流程分为 6 个主要步骤&#xff1a;模拟生成汽车数据集&#xff08;含价格标签&#xff09;数据预处理&#xff08;清洗、编码、特征选择&#xff09;探索性…

0基础安卓逆向原理与实践:第2章:编程基础与工具链

第2章:编程基础与工具链 2.1 Java编程基础 2.1.1 Java语言特性 Java是安卓应用开发的主要语言,具有以下核心特性: mindmaproot((Java特性))面向对象封装继承多态抽象平台无关字节码JVM一次编译到处运行内存管理自动垃圾回收堆栈管理引用类型安全性字节码验证安全管理器访…

深入理解JVM内存结构:从字节码执行到垃圾回收的全景解析

&#x1f9e0; 深入理解JVM内存结构&#xff1a;从字节码执行到垃圾回收的全景解析 #JVM内存模型 #Java性能优化 #垃圾回收机制 #并发编程一、JVM内存结构全景图二、线程共享区域详解 2.1 堆&#xff08;Heap&#xff09;—— 对象生存的宇宙 存储内容&#xff1a; 所有new创建…

用 C++ 构建高性能测试框架:从原型到生产实战指南

用 C 构建高性能测试框架&#xff1a;从原型到生产实战指南 ​C 测试框架的关键价值​&#xff1a;当你的测试需要每秒处理百万级交易&#xff0c;微秒级延迟要求已成为常态时&#xff0c;Python GC 的暂停便是不可接受的奢侈。 本文将深入探讨如何用 C 构建兼具灵活性和高性能…

【C语言16天强化训练】从基础入门到进阶:Day 4

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、洛谷刷题、C/C基础知识知识强化补充、C/C干货分享&学习过程记录 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人…

C语言:字符函数与字符串函数(1)

在编程的过程中&#xff0c;我们经常会遇到需要处理字符和字符串的情况&#xff0c;为了方便操作字符和字符串&#xff0c;C语言标准库中提供了一系列库函数&#xff0c;接下来我们就学习一下这些函数。 目录 1. 字符分类函数 2. 字母转换函数 3. strlen函数的使用和模拟实现…

数据结构与算法系列(大白话模式)小学生起点(一)

出身&#xff0c;并不重要 &#xff01;&#xff01;&#xff01;&#xff01;只要有恒心&#xff0c;有毅力&#xff0c;肯于付出与学习&#xff0c;皆会取得相应的成就&#xff01;天道酬勤&#xff0c;天行健&#xff0c;君子当自强不息&#xff01;道可道&#xff0c;非常道…

计算机视觉第一课opencv(二)保姆级教学

目录 简介 一、边界填充 1.函数说明 2.案例分析 二、图像运算 1.号运算 2.cv2.add()函数 3.图像加权运算 三、阈值处理 四、图像平滑处理 1.椒盐噪声 2.均值滤波&#xff08;Mean Filtering&#xff09; 3.方框滤波 4. 高斯滤波&#xff08;Gaussian Filtering&am…

DINOv3

一、摘要 https://arxiv.org/pdf/2508.10104 自监督学习有望消除对人工数据标注的需求&#xff0c;使模型能够轻松扩展到大规模数据集和更大规模的架构。由于不针对特定任务或领域进行定制&#xff0c;这种训练范式具有从各种来源学习视觉表示的潜力&#xff0c;能够使用单一…

​​pytest+yaml+allure接口自动化测试框架

高薪必备&#xff01;18K接口自动化测试框架落地全流程&#xff5c;零基础到实战通关前言# 自动化测试&#xff0c;是目前测试行业一项比较普遍的测试技术了&#xff0c;之前的以UI自动化测试为主&#xff0c;现在的以接口自动化测试为主&#xff0c;无论技术更迭&#xff0c;…

LeetCode每日一题,2025-8-20

统计全为1的正方形子矩阵 这题是正方形&#xff0c;比较简单 暴力就是二维前缀和。 或者用dp&#xff0c;dp[i][j]表示以i&#xff0c;j为右下角的最大正方形的边长&#xff0c;它由(i-1,j),(i,j-1),(i-1,j-1)三者共同决定&#xff0c;通过找规律可知&#xff0c;由三个的最小值…

在Excel启动时直接打开多个Excel文件

如果我们这段时间每天都要打开几个相同的Excel文件开展工作&#xff0c;可以把这几个文件放到一个文件夹&#xff08;如果原来就在不同的文件夹&#xff0c;就把快捷方式放到同一个文件夹&#xff09;&#xff0c;然后在Excel选项中设置启动时打开这个文件夹中的文件即可。注&a…

对象存储 COS 端到端质量系列 —— 终端网络诊断工具

背景 在COS终端SDK的众多功能中&#xff0c;文件上传功能的使用颇为频繁。鉴于此&#xff0c;提升文件上传的成功率便显得至关重要。众多导致上传失败的因素里&#xff0c;由网络问题引发的故障无疑是其中影响上传成功率的关键因素之一&#xff0c;同时也是最难以把控的要素。…