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 支持

✅ 总结对比

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

🎯 写在最后

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

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

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

相关推荐
菜市口的跳脚长颌2 小时前
Web3 基础
前端
快乐是Happy2 小时前
分享一个非常实用的防止重复提交操作
前端·javascript
王蛋1112 小时前
前端工作问题或知识记录
前端·npm·node.js
可子是我的小猫2 小时前
【JS】模块(二)
javascript
云枫晖2 小时前
JS核心知识-执行上下文
前端·javascript
麦当_2 小时前
TanStack Router File-Based Router Mask 完全指南
前端·javascript·设计模式
普通码农2 小时前
解决 Element Plus 分页组件英文显示问题
前端
珍珠奶茶爱好者2 小时前
vue二次封装ant-design-vue的table,识别columns中的自定义插槽
前端·javascript·vue.js
target酱3 小时前
Docker部署全流程
前端·docker