
本文探讨react功能组件中使用`useref`跟踪渲染次数时,首次状态更新导致计数从1跳变到3的现象。我们将揭示其核心原因在于react开发模式下的`strictmode`,它会双重调用`useeffect`以检测潜在副作用。文章将详细解释这一机制,并提供理解及应对策略,帮助开发者更准确地掌握组件生命周期。
在React功能组件中,useRef是一个常用的Hook,它允许我们在组件的整个生命周期中持久化可变值,而不会在组件重新渲染时丢失。当我们需要跟踪组件的渲染次数时,useRef结合useEffect是一个直观且常见的实现方式。
考虑以下示例代码,它尝试使用useRef来记录组件的渲染次数:
import React, { useEffect, useRef, useState } from 'react';
const UseRefComponent = () => {
    const [name, setName] = useState('');
    const renderCount = useRef(1); // 初始化为1,表示首次渲染
    useEffect(() => {
        // 在每次渲染后,递增renderCount
        renderCount.current = renderCount.current + 1;
    }); // 没有依赖项数组,每次渲染后都会执行
    return (
        <>
            <input value={name} onChange={e => setName(e.target.value)} />
            <div>My name is {name}</div>
            <div>I rendered {renderCount.current} times</div>
        </>
    );
};
export default UseRefComponent;在这个组件中,renderCount被初始化为1。每次组件渲染后,useEffect回调函数都会执行,并将renderCount.current的值加1。我们期望的行为是:
然而,实际观察到的现象是,在首次状态改变后,renderCount.current会从1直接跳变到3,而不是预期的2。这表明useEffect在某些情况下被执行了不止一次。
导致这种渲染计数异常的核心原因在于React的严格模式(StrictMode)。StrictMode是React提供的一个开发工具,用于帮助开发者识别代码中潜在的问题和副作用。它不会在生产环境中生效,只在开发模式下运行。
StrictMode的一个关键行为是,在开发模式下,它会故意双重调用某些生命周期方法和Hook函数,包括useEffect的清理函数和回调函数。具体来说:
结合上述StrictMode的行为,我们来分析renderCount的变化:
组件首次渲染(挂载阶段):
首次状态更新(例如输入框输入):
因此,在输入框输入内容后,你会在控制台或界面上看到renderCount从1直接跳变到3(或3变为4,取决于你何时观察)。
StrictMode通常在应用的入口文件(如index.js或main.jsx)中启用,通过将根组件包裹在<React.StrictMode>标签内实现。
// src/index.js 或 src/main.jsx
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App"; // 假设你的根组件是App
const rootElement = document.getElementById("root");
const root = createRoot(rootElement);
root.render(
  <StrictMode>
    <App /> {/* 你的整个应用都在StrictMode的包裹下运行 */}
  </StrictMode>
);如果你移除<StrictMode>标签,你会发现renderCount的行为将符合预期,即首次状态改变后从1变为2。
总之,React useRef在StrictMode下显示渲染计数从1到3的跳变是预期的开发行为,旨在帮助开发者构建更健壮的应用。理解这一机制,而不是试图“修复”它,是更专业的做法。
以上就是React useRef渲染计数跳变:StrictMode模式的幕后影响的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号