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

React18 严格模式下的双重渲染之谜

文章目录

    • 问题
    • 分析
    • 解决
      • 方式一:使用状态标志
      • 方式二:使用 useRef
      • 方式三:移除严格模式
      • 方式四:使用 useCallback

问题

这是一个 React Demo 项目 ,启动后在 Chrome 控制台里发现 控制台 被打印了 “两次”,但是,在生产环境中,这个问题通常不会出现,所以可以主要关注开发环境中的行为。

// 入口文件
import { StrictMode } from 'react';
import * as ReactDOMClient from 'react-dom/client';
import App from './App';
const root = ReactDOMClient.createRoot(document.getElementById('root'));
root.render(<StrictMode><App /></StrictMode>
);
// 组件代码
import React, { useEffect } from 'react';const App = () => {useEffect(() => {console.log('组件挂载完成!');}, []);return <>Hello world!</>;
};

分析

  1. 这是 React18 才新增的特性。

  2. 仅在开发模式(“development”)下,且使用了严格模式(“Strict Mode”)下会触发。
    生产环境(“production”)模式下和原来一样,仅执行一次。

  3. 之所以执行两次,是为了模拟立即卸载组件和重新挂载组件。
    为了帮助开发者提前发现重复挂载造成的 Bug 的代码。
    同时,也是为了以后 React的新功能做铺垫。
    未来会给 React 增加一个特性,允许 React 在保留状态的同时,能够做到仅仅对UI部分的添加和删除。
    让开发者能够提前习惯和适应,做到组件的卸载和重新挂载之后, 重复执行 useEffect的时候不会影响应用正常运行。

  4. 每次组件渲染时,React 都会更新页面 UI,然后运行 useEffect 中的代码

  5. Effect 在屏幕更新之后的 rendering 进程结束的时候执行。

解决

方式一:使用状态标志

const [isDataFetched, setIsDataFetched] = useState(false);useEffect(() => {if (!isDataFetched) {getDataList();setIsDataFetched(true);}
}, [isDataFetched]);

方式二:使用 useRef

const dataFetchedRef = useRef(false);useEffect(() => {if (dataFetchedRef.current) return;dataFetchedRef.current = true;getDataList();
}, []);

方式三:移除严格模式

方式四:使用 useCallback

将 getDataList 函数用 useCallback 包裹,可以确保它的引用稳定性。

http://www.dtcms.com/a/315873.html

相关文章:

  • 【01】OpenCV C++实战篇——基于多项式插值的亚像素边缘定位算法
  • NLP自然语言处理 02 RNN及其变体
  • golang 1.24引入alias types的原因
  • Mac上pnpm的安装与使用
  • 《计算机“十万个为什么”》之 面向对象 vs 面向过程:编程世界的积木与流水线
  • VSCode中使用Qt
  • MySQL 如何优化慢查询
  • Apifox使用mock模仿后端返回数据
  • Java异常讲解
  • PowerShell 入门2: 使用帮助系统
  • 开源密码恢复实用程序 Hashcat 7.0.0 发布
  • 灰色优选模型及算法MATLAB代码
  • 2025年6月中科院2区-红杉优化算法Sequoia Optimization Algorithm-附Matlab免费代码
  • vscode 关闭自动更新
  • ELK是什么
  • 数学建模-线性规划。
  • 数学建模算法-day[15]
  • ubuntu24安装vulkan-sdk
  • golang实现支持100万个并发连接(例如,HTTP长连接或WebSocket连接)系统架构设计详解
  • 【单板硬件】基于AD的单板硬件设计
  • 剑指offer第2版:字符串
  • DAY 36 复习日
  • 【深度学习新浪潮】TripoAI是一款什么样的产品?
  • MinIO01-入门
  • 自抗扰ADCR--跟踪微分器的作用
  • 【unitrix】 7.3 二进制整数 带进位加法实现(int_add.rs)
  • 【2025WACV-目标检测方向】
  • uniapp 类似popover气泡下拉框组件
  • 21 - 大模型智能体进阶指南 (5):电影助手的知识革命:从静态存储到实时进化 —— 检索增强与自主学习的协同机制
  • 防水防尘防摔性能很好的智能三防手机,还有22000mAh大电池