React 核心 Hook 与冷门技巧:useReducer、useEffect、useRef 及 is 属性全解析

📚 前言

React 的函数组件 + Hooks 模式已经成为现代前端开发的主流。相比类组件,Hooks 让状态管理和副作用处理更加简洁和可复用。但在实际开发中,除了常用的 useStateuseEffect,还有很多“进阶武器”值得我们掌握。

本文将深入讲解三个核心 Hook:useReduceruseEffectuseRef,并揭秘一个常被忽视但极具潜力的 HTML 属性——is 在 React 中的应用场景,助你写出更优雅、更高效的 React 代码。


一、useReducer:复杂状态管理的利器

1.1 什么是 useReducer

useReducer 是 React 提供的一个 Hook,用于管理组件中复杂的状态逻辑。它类似于 Redux 的 reducer 模式,但更轻量,无需引入额外库。

1.2 基本语法

const [state, dispatch] = useReducer(reducer, initialState);
  • reducer:一个纯函数 (state, action) => newState
  • initialState:初始状态
  • dispatch:用于派发动作(action)来更新状态

1.3 使用场景

✅ 状态结构复杂(如嵌套对象)
✅ 多个状态相互依赖
✅ 状态更新逻辑较多

1.4 示例:计数器

function reducer(state, action) {switch (action.type) {case 'increment': return { count: state.count + 1 };case 'decrement': return { count: state.count - 1 };default: throw new Error();}
}function Counter() {const [state, dispatch] = useReducer(reducer, { count: 0 });return (<div>Count: {state.count}<button onClick={() => dispatch({ type: 'increment' })}>+</button><button onClick={() => dispatch({ type: 'decrement' })}>-</button></div>);
}

💡 优点:逻辑集中、可预测、易于测试。


二、useEffect:副作用的管理中心

2.1 什么是 useEffect

useEffect 用于在函数组件中执行副作用操作,如数据获取、订阅、手动 DOM 操作等。它是 componentDidMountcomponentDidUpdatecomponentWillUnmount 的组合。

2.2 基本语法

useEffect(() => {// 副作用逻辑return () => {// 清理逻辑(可选)};
}, [dependencies]);

2.3 常见用法

✅ 组件挂载后执行一次
useEffect(() => {fetchData();
}, []); // 空依赖数组 → 只执行一次
✅ 监听某个状态变化
useEffect(() => {fetchUserData(userId);
}, [userId]); // userId 变化时重新执行
✅ 清理资源(防止内存泄漏)
useEffect(() => {const timer = setInterval(() => console.log('tick'), 1000);return () => clearInterval(timer); // 组件卸载时清理
}, []);

⚠️ 注意:避免无限循环、正确处理异步操作。


三、useRef:持久化引用的“盒子”

3.1 什么是 useRef

useRef 返回一个可变的引用对象,其 .current 属性可以保存任意值,并且修改它不会触发组件重新渲染

3.2 核心用途

✅ 1. 访问 DOM 元素
const inputRef = useRef(null);
useEffect(() => {inputRef.current.focus(); // 自动聚焦
}, []);
<input ref={inputRef} type="text" />
✅ 2. 存储可变变量(不触发重渲染)
const timerRef = useRef(null);
timerRef.current = setInterval(...);
// 清理时使用 clearInterval(timerRef.current)
✅ 3. 获取上一次的值
function usePrevious(value) {const ref = useRef();useEffect(() => { ref.current = value; });return ref.current;
}

📌 关键区别useRef 不会触发重渲染,而 useState 会。


四、is 属性:Web Components 的秘密武器

4.1 is 是 React 关键词吗?

不是! isHTML 标准属性,用于定义自定义内置元素(Customized Built-in Elements),属于 Web Components 技术栈。

4.2 作用与语法

让一个自定义元素继承原生 HTML 元素的行为

<button is="custom-toggle-button">切换</button>

4.3 在 React 中的使用

<button is="fancy-button" onClick={handleClick}>提交
</button>

前提:已通过 customElements.define('fancy-button', ...) 注册组件。

4.4 注意事项

  • 仅在使用 Web Components 时需要
  • 不要误用于条件渲染(如 <div is={true}> ❌)
  • 老浏览器需 polyfill 支持

✅ 总结对比

特性useReduceruseEffectuseRefis 属性
用途管理复杂状态处理副作用持久化引用扩展原生元素
是否触发重渲染否(通过 dispatch)否(副作用本身)
典型场景表单、多状态联动数据请求、定时器DOM 操作、实例变量Web Components
是否 React 独有✅ 是✅ 是✅ 是❌ 否(HTML 标准)

🎯 写在最后

掌握 useReduceruseEffectuseRef 是成为 React 高手的必经之路,而了解 is 属性则能让你在面对 Web Components 项目时游刃有余。

希望本文能帮助你更好地理解这些知识点,并在实际项目中灵活运用。如果你觉得有收获,欢迎点赞、收藏、转发!

关注我,持续输出前端干货!
评论区欢迎交流:你在项目中是如何使用这些特性的?

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

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

相关文章

通义灵码产品演示: 数据库设计与数据分析

作者&#xff1a;了哥 演示主题&#xff1a;AI 进行数据库设计以及做数据分析 演示目的 演示通义灵码对于数据库的设计能力以及数据分析能力。 演示准备 准备数据库&#xff0c;这里为了简单实用 sqlite3 brew install sqlite3使用 vscode&#xff0c;同时安装好通义灵码的插件…

MySQL主从同步参数调优案例

#作者&#xff1a;stackofumbrella 文章目录一、前言二、故障概述2.1 基础信息2.2 故障现象描述三、故障诊断分析3.1 排查过程3.2 问题根因四、故障解决方案 &#x1f4ca;4.1 解决方案 &#x1f6e0;️五、总结附件一、前言 在磐基系统中大量使用MySQL作为后端的数据存储&…

【代码随想录算法训练营——Day10】栈与队列——232.用栈实现队列、225.用队列实现栈、20.有效的括号、1047.删除字符串中的所有相邻重复项

LeetCode题目链接 https://leetcode.cn/problems/implement-queue-using-stacks/ https://leetcode.cn/problems/implement-stack-using-queues/description/ https://leetcode.cn/problems/valid-parentheses/description/ https://leetcode.cn/problems/remove-all-adjacent-…

Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL

在 .NET 或 .NET Core 应用中&#xff0c;若需在不依赖 Windows 服务、独立进程的前提下实现后台处理&#xff0c;Hangfire 是最成熟、简单的方案之一 —— 它可直接嵌入现有应用&#xff08;如 ASP.NET Core Web 应用&#xff09;&#xff0c;无需额外部署&#xff0c;同时提供…

网站漏洞扫描要怎么处理?

在网络安全领域&#xff0c;网站漏洞是黑客攻击的重要突破口&#xff0c;而网站漏洞扫描能及时发现这些隐患。但很多小白在完成漏洞扫描后&#xff0c;不清楚后续该如何处理&#xff0c;导致漏洞一直存在&#xff0c;给网站安全埋下风险。下面从准备工作、处理步骤、验证维护等…

淘宝RecGPT:通过LLM增强推荐

导论背景 (Background)​​推荐系统的核心挑战​​&#xff1a;怎么 准确推断 用户行为背后快速变化的真实意图&#xff0c;以实现用户、商户和平台的三赢。​​现有方法的局限性​​&#xff1a;传统的基于历史日志共现模式&#xff08;“从点击学习点击”&#xff09;的模型&…

【Go系统编程】07 网络化IPC:Go的王牌——Socket编程

大家好&#xff0c;我是Tony Bai。欢迎来到我们《Go 系统编程》专栏的最后一讲。在过去的旅程中&#xff0c;我们探索了管道、消息队列、共享内存等一系列强大的 IPC 机制。它们各有所长&#xff0c;但都有一个共同的、致命的局限性&#xff1a;它们都只能在同一台物理机上工作…

claude code使用小窍门

视频地址 B站 1 /init 在项目最开始的时候&#xff0c;使用/init可以将项目通读一遍。cc会将学习到的关于项目的知识都保存到CLAUD.MD文件中 2、 /compact 用来压缩对话的上下文&#xff0c;claude会将之前的一些乱七八糟或者重复的对话删除压缩&#xff0c;有利于提高AI的…

The learning process of Decision Tree Model|决策树模型学习过程

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章&#xff0c;有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn&#xff0c;这里还有很多有关计算机的知识&#xff0c;欢迎进行留言或…

期货盘后空开是认购期权行权?

本文主要介绍期货盘后空开是认购期权行权&#xff1f;期货盘后空开与认购期权行权是两个独立的概念&#xff0c;无直接关联&#xff0c;需从交易机制、操作逻辑及市场规则三方面区分。期货盘后空开是认购期权行权&#xff1f;1. 定义与交易属性期货盘后空开&#xff1a;属于期货…

ESP32 I2S音频总线学习笔记(七):制作一个录音播放器

简介 上一篇我们利用I2S输出DIY了一个蓝牙音箱简单玩了一下&#xff0c;本篇我们继续来看代码。前面几篇文章我们分别介绍了I2S输入&#xff0c;I2S输出&#xff0c;以及WAV文件格式的相关内容&#xff0c;那我们就可以根据所学到的&#xff0c;制作一个录音机&#xff0c;具体…

PyTorch 动态图的灵活性与实用技巧

PyTorch 以其动态计算图&#xff08;Dynamic Computation Graph&#xff09;而闻名&#xff0c;这赋予了它极高的灵活性和易用性&#xff0c;使其在研究和实际应用中都备受青睐。与TensorFlow 1.x的静态图&#xff08;需要先定义图结构&#xff0c;再运行&#xff09;不同&…

#C语言——刷题攻略:牛客编程入门训练(十一):攻克 循环控制(三),轻松拿捏!

&#x1f31f;菜鸟主页&#xff1a;晨非辰的主页 &#x1f440;学习专栏&#xff1a;《C语言刷题合集》 &#x1f4aa;学习阶段&#xff1a;C语言方向初学者 ⏳名言欣赏&#xff1a;"代码行数决定你的下限&#xff0c;算法思维决定你的上限。" 前言&#xff1a;在学习…

复杂PDF文档结构化提取全攻略——从OCR到大模型知识库构建

在学术研究、金融分析、法律合同、工程设计等众多领域&#xff0c;PDF文档已成为信息存储与传递的重要载体。然而&#xff0c;面对包含复杂表格、公式、图表、手写批注、多栏排版等元素的PDF&#xff0c;传统工具往往难以准确、完整地提取内容。这不仅影响信息利用效率&#xf…

HttpClient、OkHttp 和 WebClient

HttpClient、OkHttp 和 WebClient 是 Java 生态中常见的 HTTP 客户端&#xff0c;它们在设计理念、异步能力、性能等方面有所不同。以下是它们的详细对比&#xff1a;1. 概述客户端介绍Apache HttpClient传统同步 HTTP 客户端&#xff0c;功能丰富&#xff0c;历史悠久&#xf…

书籍成长书籍文字#创业付费杂志《财新周刊》2025最新合集 更33期

免费访问地址 https://isharehubs.com/article/2025-33-26c27ee5bb9180cdafc5efbec9545ac5 资源信息 付费杂志《财新周刊》2025最新合集 更33期 《财新周刊》2025 最新合集&#xff08;更至 33 期&#xff09;重磅上线&#xff0c;聚焦年度热点与结构性变化&#xff0c;从监…

用python的socket写一个局域网传输文件的程序

局域网传输文件是最最常用的功能&#xff0c;我参考https://www.jb51.net/python/345837qrz.htm这篇文章&#xff0c;复制粘贴&#xff0c;开发了一个。但发现进度条没有用&#xff0c;也没有显示传输用时和传输速度的功能&#xff0c;于是我改写了代码&#xff0c;使它实现这个…

深度剖析Linux内核无线子系统架构

文章目录1、资料快车2、目录介绍2、术语3、Linux无线子系统概述4、内核无线子系统框架1&#xff09;认识内核无线子系统中的三个软件框架2、无线网络子系统框架3、Android WIFI Management框架1&#xff09;fullMAC和softMAC是什么&#xff1f;2&#xff09;fullmac对比softmac…

unity UGUI 鼠标画线

using UnityEngine; using UnityEngine.EventSystems; using System.Collections.Generic; using UnityEngine.UI; /* 使用方法&#xff1a; 在场景中新建一个空的 GameObject&#xff08;右键 -> UI -> 空对象&#xff0c;或直接创建空对象后添加 RectTransform 组件&am…