React 中 useRef 和 useState 的使用场景区别

一、前言

在 React 中,useRefuseState 是两个常用的 Hook,它们都可以用来存储数据,但用途和更新机制有明显差异。理解它们的使用场景区别,有助于我们写出更高效、可维护的组件代码。


二、useState 的特点与使用场景

1. 特点

  • 用于存储 会影响组件渲染的数据

  • 当状态发生变化时,React 会重新渲染组件。

  • 适合处理 UI 交互状态,如表单输入、计数器、切换状态等。

2. 使用示例

复制代码
import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  const increment = () => setCount(count + 1);

  return (
    <div>
      <p>当前计数:{count}</p>
      <button onClick={increment}>增加</button>
    </div>
  );
}

export default Counter;

在这个例子中,每次点击按钮,count 状态变化,组件会重新渲染,页面显示的数字也会更新。

3. 使用场景总结

  • 需要触发 组件重新渲染 的数据。

  • 依赖于 UI 更新的状态,例如:表单输入值、开关状态、计数器等。


三、useRef 的特点与使用场景

1. 特点

  • 用于存储 不需要触发渲染的数据

  • useRef 返回一个可变对象 { current: ... },可以直接修改 current 属性。

  • 常用于:

    • 访问 DOM 元素

    • 保存定时器、外部变量、上一次渲染的值

2. 使用示例

2.1 访问 DOM 元素

javascript 复制代码
import React, { useRef } from 'react';

function InputFocus() {
  const inputRef = useRef(null);

  const focusInput = () => {
    inputRef.current.focus();
  };

  return (
    <div>
      <input ref={inputRef} type="text" />
      <button onClick={focusInput}>聚焦输入框</button>
    </div>
  );
}

export default InputFocus;

这里使用 useRef 获取 DOM 节点,并操作它,而不需要触发组件重新渲染。

2.2 保存不触发渲染的变量

javascript 复制代码
import React, { useRef, useState } from 'react';

function Timer() {
  const countRef = useRef(0);
  const [ignored, setIgnored] = useState(0);

  const incrementRef = () => {
    countRef.current += 1;
    console.log(countRef.current);
  };

  const forceRender = () => setIgnored(ignored + 1);

  return (
    <div>
      <button onClick={incrementRef}>增加 ref 计数(不刷新)</button>
      <button onClick={forceRender}>强制刷新</button>
    </div>
  );
}

export default Timer;

countRef 的更新不会触发组件渲染,而 forceRender 通过 useState 强制刷新组件。

3. 使用场景总结

  • 不依赖于 UI 渲染的状态。

  • 需要 在多次渲染间保存数据,但不想每次都触发渲染。

  • 操作 DOM 或保存定时器、上一次的值、外部对象等。


四、useState 与 useRef 的对比

特性 useState useRef
更新是否触发渲染
保存数据的生命周期 组件整个生命周期 组件整个生命周期
是否可访问 DOM
使用场景 UI 状态、交互数据 DOM 引用、缓存数据、定时器、跨渲染变量

总结关键点

  • 需要渲染更新 → 用 useState

  • 不需要渲染更新 → 用 useRef


五、实际开发建议

  1. UI 状态优先用 useState,保持 React 哲学和响应式特性。

  2. 避免滥用 useRef 保存状态,否则可能导致组件不刷新,UI 与数据不同步。

  3. 操作 DOM、保存定时器、跨渲染变量 使用 useRef,既高效又安全。


六、结语

掌握 useStateuseRef 的使用场景区别,是写高效 React 组件的关键。合理选择 Hook,不仅能减少不必要的渲染,还能让代码逻辑更清晰、更易维护。

相关推荐
你挚爱的强哥6 分钟前
Vue2 实现 1.5s 十连击监听(连续点击若干次),封装通用可复用点击检测工具,不用 data!Vue 封装通用连击监听方法,支持自定义时长与点击次数
前端·javascript·vue.js
半个落月22 分钟前
用 LangChain.js 手写一个能读写文件和执行命令的 Mini Cursor
javascript·人工智能·后端
天外天-亮37 分钟前
HBuilder X 使用 uview-plus 方式
开发语言·javascript·hbuilder x·uview-plus
huashengzsj44 分钟前
Shopify个人建站如何搭建独立站:从零开始的完整指南
前端·网络·人工智能
程序猿小泓1 小时前
从 Claude Code 学 Agent Harness:一个前端工程师的 AI Agent 学习笔记
前端·人工智能·学习
柒和远方2 小时前
从审计日志到可下载证据包:事务型 Outbox、租约 fencing 与保留水位
前端·后端·架构
minglie12 小时前
npm ali-oss库依赖冲突
前端·npm
CryptoPP2 小时前
BSE股票K线数据接入实战:从接口调用到前端图表展示
大数据·前端·网络·人工智能·websocket·网络协议
YFF菲菲兔2 小时前
React 事件系统:listenToAllSupportedEvents
react.js
Random_index4 小时前
#Vue3篇: Vue 项目发版后如何提示用户刷新?基于 package.json 版本号的前端更新检测方案
前端·vue.js·json