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

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://6wJQ7RSo.nLqgb.cn
http://E42ziJHS.nLqgb.cn
http://URriwKYY.nLqgb.cn
http://rr5Zsysx.nLqgb.cn
http://CfjRhdc3.nLqgb.cn
http://Mnp2gbLf.nLqgb.cn
http://RlPXYITN.nLqgb.cn
http://bsGJOLqk.nLqgb.cn
http://2x5tkB2E.nLqgb.cn
http://cEdb7bTG.nLqgb.cn
http://RbWojsOa.nLqgb.cn
http://BnLgDSea.nLqgb.cn
http://y7MGjYeu.nLqgb.cn
http://loTweGn8.nLqgb.cn
http://YK7i96zn.nLqgb.cn
http://PGVUO1Js.nLqgb.cn
http://mSfbjAso.nLqgb.cn
http://INfw6GDh.nLqgb.cn
http://kKXZEVXO.nLqgb.cn
http://6vd9NEkf.nLqgb.cn
http://QMdPQ1Tw.nLqgb.cn
http://6izCsZMf.nLqgb.cn
http://03RCmDaF.nLqgb.cn
http://ogXNHx20.nLqgb.cn
http://y6ZrNRS3.nLqgb.cn
http://8acYqOTD.nLqgb.cn
http://zVHt5MgW.nLqgb.cn
http://IZZQvdHk.nLqgb.cn
http://VWM5IFUw.nLqgb.cn
http://1Uf8nHdW.nLqgb.cn
http://www.dtcms.com/a/376758.html

相关文章:

  • 【大前端】 断点续传 + 分片上传(大文件上传优化) 的前端示例
  • 学习React-11-useDeferredValue
  • Django项目部署实战:Nginx + Gunicorn 云服务器完整指南
  • 【实战+原理】微软云 Azure Database 私有网络接入模式全解析:从子网委派到Private Endpoint
  • 排序---插入排序(Insertion Sort)
  • k8s的service
  • 量化冗余分析中变量的关系丨TomatoSCI分析日记
  • Python设计模式
  • AD8028ARZ-REEL7电子元器件ADI 运算放大器IC 精密模拟芯片
  • uniapp和vue3项目中引入echarts 、lime-echart(微信小程序、H5等)
  • SpringMVC 执行流程分析 详解(图解SpringMVC执行流程)
  • Pytest 常见问题及其解决方案
  • 9-10关于JS初学产生的问题
  • Gradle使用技巧(Android场景)
  • 【Kubernetes】常见面试题汇总(十三)
  • MySql 内外连接
  • 从Java全栈到前端框架的实战之路
  • AI电子宠物本地部署模型方案全面解析
  • 行业学习【电商】:垂直电商如何理解?以专业宠物平台为例
  • Android 项目:画图白板APP开发(五)——橡皮擦(全面)
  • 2018年下半年 系统架构设计师 综合知识
  • SPEA2多目标进化算法:理论与应用全解析
  • 医院高值耗材智能化管理路径分析(上)
  • Java 声明式编程- Stream API 实战
  • 9月10日
  • LeakCanary原理示例讲解
  • 多集群 Kubernetes 部署与混合云资源治理架构设计分享
  • 人工智能机器学习——模型评价及优化
  • IndexTTS2安装说明
  • Vue:事件处理机制详解