首页 > 其他分享 >前端 | 如何处理 React18 componentDidMount 重复执行两次的问题 | React

前端 | 如何处理 React18 componentDidMount 重复执行两次的问题 | React

时间:2023-09-30 13:07:04浏览次数:31  
标签:18 componentDidMount React Strict React18 组件 加载 Mode

前端 | 如何处理 React18 componentDidMount 重复执行两次的问题 | React

问题描述

按照 React 官网推荐方式创建项目,在运行项目的时,发现组件的 componentDidMount 方法被触发了两次。但是在旧项目中并没有这样的问题,于是觉得奇怪,以为是自己哪里使用错了,一直在排查。经过查阅官方文档以及网上资料,终于发现了问题所在。

内容分析

比较两个项目的 package.json 文件,发现旧项目 React 用的是 17.x 版本;而新项目用的是 18.x 版本。

后来在Github找到关于18版本的一些Feature

https://github.com/facebook/react/blob/main/CHANGELOG.md#breaking-changes

Stricter Strict Mode: In the future, React will provide a feature that lets components preserve state between unmounts. To prepare for it, React 18 introduces a new development-only check to Strict Mode. React will automatically unmount and remount every component, whenever a component mounts for the first time, restoring the previous state on the second mount. If this breaks your app, consider removing Strict Mode until you can fix the components to be resilient to remounting with existing state.

大意如下:

在未来,React会提供一个新特性,该特性会使得组件取消加载后能维持状态。React 18会再 Strict Mode 中引入一个新的开发模式。React将会对每一个组件自动取消加载并重新加载。如果其干扰了你的应用,移除 Strict Mode 就能够修复组件重新加载的问题。

解决方法

知道了原因之后,将 index.tsx 或者 index.js 文件里的 React.StrictMode 高阶组件包围去掉即可。

修改前

root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

修改后

root.render(
  // <React.StrictMode>
    <App />
  // </React.StrictMode>
);

结尾

本期的内容就到这里,路过的小伙伴记得支持一下哦!

标签:18,componentDidMount,React,Strict,React18,组件,加载,Mode
From: https://blog.51cto.com/appleex/7655699

相关文章

  • 前端 | React setState 同步异步以及处理方式 | React
    前端|ReactsetState同步异步以及处理方式|React问题描述在同步执行流程中setState表现为异步,而在异步执行流程中setState表现为同步。示例:有一个控制DOM节点显隐的状态值,默认为false,而下一步就需要获取该DOM节点做一系类处理。所以一开始使用setState设置状态值为true,让该......
  • js:创建一个基于vite 的React项目
    相关文档Vite官方中文文档React中文文档ReactRouterRedux中文文档AntDesign5.0AwesomeReact创建vite+react项目pnpmcreatevitereact-app--templatereact#根据提示,执行命令cdreact-apppnpminstallpnpmrundev项目结构$tree-L1.├──README.md├──......
  • Java:Springboot和React中枚举值(数据字典)的使用
    目录1、开发中的需求2、实现效果3、后端代码4、前端代码5、接口数据6、完整代码7、参考文章1、开发中的需求开发和使用过程中,通常会涉及四个角色:数据库管理员、后端开发人员、前端开发人员、浏览者数据库使用int类型的数值进行存储(eg:0、1、2)Java代码使用enum枚举类型的对象进行......
  • React Native 动画(Animated)
    实现效果代码从react-native中引入import{Animated,Easing,}from'react-native';js实现constopacity1=useRef(newAnimated.Value(0.2)).current;constopacity2=useRef(newAnimated.Value(0.2)).current;constscale1=useRef(newAnimated.Valu......
  • React-Native之Gradle下载慢的解决方案
    一、解决gradle下载慢的问题1.使用国内镜像   maven脚本如下:buildscript{repositories{maven{url'https://maven.aliyun.com/repository/gradle-plugin'}maven{url'https://maven.aliyun.com/repository/google'}maven......
  • uniapp自动引入Vue3(ref,reactive...)的API、uniapp生命周期和封装hooks
    未自动导入Vue3(ref,reactive...)的API和uniapp生命周期,需要在每个页面把API和uniapp生命周期的代码都重复写一遍<scriptsetup>import{ref,reactive}from"vue"import{onLaunch,onShow,onHide}from'@dcloudio/uni-app'//封装的hooksimport{useLi......
  • react + react-router + less +antd 开发环境
    react+react-router+less+antd开发环境 react+react-router+less+antd开发环境搭建1.基于create-reacte-app,需要先安装这个脚手架,然后初始化项目。2.进入项目目录,首先npmruneject释放配置文件。3.安装各种包npminstallreact-routerreact-router-domle......
  • React表单合理取值方式
    React表单完全使用受控组件,即使用value和onChange来控制input状态<inputvalue={email}onChange={(e)=>setEmail(e.target.value)}/>在input输入字符时候,会频繁触发表单重新渲染,因为state改变,react进行了re-render要避免此种情况,可以使用非受控组件的表单,在组件之间没有......
  • React & TS 里面两个实用小技巧
    ❝在工作中我们会经常使用技巧和黑魔法,本篇主要讲两个,希望能帮助到大家!文章内容看情况而定,不一定是React里面专属的!❞TS动态取数据这里其实也不知道起什么标题,具体还是看内容吧。平常做法(JS)在JS中,我经常使用对象去定义数据,然后去获取它,像下面这样//订单状态//只是举个栗子不......
  • React:我们的用法习惯可能是错误的(不优雅)
    React:我们的用法习惯可能是错误的(不优雅)今天学到了2023-01-088,361阅读4分钟 在我们React的日常开发中一些常用的写法,看似运行的很好,实际可能并不优雅。学习React并不是如何如何使用它,而是如何写出优雅,干净的代码。下面举一些例子,总结了一些React开发中不好的写法及相......