You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中不重渲染组件时显示useRef递增计数器值的问题

解决useRef计数器值不更新页面的问题(不触发组件重渲染)

问题核心

useRef的current属性变更不会触发组件重渲染,所以你JSX中写的{changes.current}只会在组件初始渲染时读取一次值,后续即使changes.current递增,页面也不会自动更新。而之前用document.getElementById("p_id")无效,大概率是因为React的虚拟DOM机制或DOM元素查找时机的问题,直接用React提供的ref绑定DOM元素才是更可靠的方式。

解决方案:用useRef绑定DOM元素并直接更新内容

我们可以给<p>标签绑定一个ref,然后在点击事件中直接修改该DOM元素的文本内容,全程不会触发组件重渲染。

修改后的代码:

import "./styles.css";
import React, { useRef } from "react";

export default function App() {
  const changes = useRef(0);
  // 绑定显示计数器的p元素
  const countDisplayRef = useRef(null);

  const changingValue = () => {
    changes.current++;
    console.log("New Value: " + changes.current);
    // 直接更新DOM文本
    if (countDisplayRef.current) {
      countDisplayRef.current.textContent = changes.current;
    }
  };

  console.log("rendering not happening");

  return (
    <div className="App">
      <button onClick={changingValue}>
        <b>Click me</b>
      </button>
      {/* 将ref绑定到p元素 */}
      <p ref={countDisplayRef}>{changes.current}</p>
    </div>
  );
}

说明

  • 点击按钮时,changes.current递增,同时通过countDisplayRef.current.textContent直接修改真实DOM的内容,这个操作完全绕开了React的重渲染机制,控制台的rendering not happening只会在初始渲染时打印一次。
  • 用useRef绑定DOM元素比document.getElementById更符合React的设计理念,能避免因组件挂载顺序、DOM结构变化导致的元素查找失败问题。

内容的提问来源于stack exchange,提问作者Arpit Goel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:00:56