【React】- 组件生命周期连续渲染两次问题

news2024/11/26 1:33:13

最近在整理生命周期相关的知识内容,然后发现一个奇怪的现象,即组件的生命周期会运行2次!经过确认不是代码问题,于是开始找度娘,终于找到其原因-React中的严格模式,在这里记录一下

一、问题重现

如图所示,当组件初始化渲染时,每个周期都走了2次,按理说初始化时所有运行的生命周期都仅执行一次。
代码

import { Component } from "react";
class Com extends Component {
  constructor(props) {
    super(props);
    this.state = {
      value: 0,
    };
    console.log(this.props);
  }
  componentWillMount() {
    console.log("组件即将挂载到页面上 - componentWillMount");
  }
  render() {
    console.log("组件渲染虚拟dom - render")
    return (
      <div> </div>
    );
  }
  componentDidMount(){
    console.log('虚拟dom此时已经变成真实dom,挂载到页面上了 - componentDidMount')
  }
}

export default Com;

现象
在这里插入图片描述

二、问题原因

之所以会调用2次,其实都是因为React中的严格模式 - StrictMode

StrictMode是一个用来检查项目中潜在问题的工具。与 Fragment 一样,StrictMode 不会渲染任何可见的 UI。它为其后代元素触发额外的检查和警告。

需要注意的是:严格模式检查仅在开发模式下运行;它们不会影响生产构建。

StrictMode 的作用有很多,如下所示:
1、识别不安全的生命周期;
2、关于使用过时字符串 ref API 的警告;
3、关于使用废弃的 findDOMNode 方法的警告;
4、检测意外的副作用;
5、检测过时的 context API
但此篇文章就不展开一一赘述了,这里仅回归到本文探讨的问题:组件的一次更新流程,在视图真正刷新之前的部分都是可能被多次调用的,因而这些部分中不能出现副作用,开发环境下会刻意触发两次以使得开发者能注意到误用的副作用。

三、问题解决

知道了原因之后,问题就很好解决了,我们只需要将StrictMode注释掉即可,如下所示。(一般是在index.js文件中使用)

import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { BrowserRouter } from "react-router-dom";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <BrowserRouter>
    {/* <React.StrictMode> */}
      <App />
    {/* </React.StrictMode> */}
  </BrowserRouter>
);
reportWebVitals();

此时运行项目,组件的生命周期触发现象如下,确实已经正常了!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/750398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

速通matplotlib库

速通matplotlib库 前言 ​ 最近在复习之前学习过的知识点&#xff0c;因此想到把学过的总结一下&#xff0c;方便后面再次复习&#xff0c;所以有了这个系列。 说明 ​ 由于标题写的是“速通”&#xff0c;因此我的想法是可以让大家看完这篇文章&#xff0c;可以上手matplotlib…

WebSocket从入门到精通

WebSocket 是什么&#xff1f; WebSocket是HTML5规范提出的一种协议&#xff1b;目前除了IE浏览器&#xff0c;其他浏览器都基本支持。它是一种协议&#xff0c;万变不离其宗&#xff0c;也是基于TCP协议的&#xff0c;和HTTP协议是并存的两种协议。HTML5 Web Sockets规范定义了…

快速排序算法解析

快速排序算法解析 快速排序法 快速排序是一种经典的分治算法&#xff0c;它采用递归的方式将待排序数组分割成较小的子数组&#xff0c;然后通过基准元素的选择和元素的交换来达到排序的目的。 快速排序的核心思想是通过选取基准元素&#xff0c;并将其他元素与基准元素进行比…

如何在工作中保持稳定的情绪? – 个人看法和建议

文章目录 每日一句正能量前言情绪波动的原因建议情绪调节技巧和策略身处逆境&#xff0c;如何治愈自己 后记 每日一句正能量 所谓的快乐&#xff0c;是指身体的无痛苦和灵魂的无纷扰。——伊壁鸠鲁 前言 在工作中保持稳定的情绪对于每一个职场人来说都是非常重要的。随着工作压…

什么是vlan为什么要划分vlan

首先了解交换机的数据的转发方式。&#xff0c;有两种情况会使用广播方式进行数据分发&#xff0c;第一种就是目的地址是全F的&#xff08;FF-FF-FF-FF-FF-FF&#xff09;&#xff0c;第二种是位置的单播帧&#xff0c;这样的情况下会带来什么杨的问题呢。 场景引入&#xff1…

Vue2 使用vcolorpicker报错问题解决

1、安装步骤省略 2、全局引入步骤省略 3、引入后注册组件会报如下错误 Failed to mount component: template or render function not defined. 按照文档给的例子直接这样写 不用注册组件就不报错了~

菜鸡shader:L10 帧序列动画和极坐标的使用

文章目录 帧序列动画代码最后效果 极坐标代码最后效果 顶点色 这次笔记就直接放最后的效果了&#xff0c;因为课程上老师也没有给代码图片或是什么技巧说明。 下图左边是帧序列动画(鬼火)&#xff0c;右边是极坐标。 帧序列动画 帧序列的原理是对一张有规律行列排序的序列帧…

35. 反转链表

目录 链接&#xff1a; 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 图片&#xff1a; 链接&#xff1a; 原题链接 题目&#xff1a; 定义一个函数&#xff0c;输入一个链表的头结点&#xff0c;反转该链表并输出反转后链表的头结点。 思考题&#xff1a; 请同时…

逻辑(css)-背景网格制作(linear-gradient)

目录 linear-gradient需求实现 linear-gradient 语法&#xff1a;linear-gradient([direction], color-stop1, color-stop2, ...) 第一个参数为(可选)方向参数&#xff0c;可以是度数也可以是方位名词,方向与读书的关系如下&#xff1a; 角度方位文字说明示例0degto top从下…

centos7 环境下部署 nacos单机模式

1、官网下载 nacos 官网地址&#xff1a;home 去github上下载nacos-server。我下载的是 nacos-server-1.4.1.tar.gz 2、安装 nacos 下载完成后&#xff0c;将安装包上传到 centos 创建 nacos 目录&#xff08;安装位置任意&#xff09; mkdir -p /usr/local/nacos解压 nac…

springboot html乱码

一、问题重现 二、代码展示 代码的编码都是正常的 修改了File Encodings配置项&#xff0c;结果不管用 三、终极解决方案 终于解决

MATLAB 基于CPD的点云配准 (24)

MATLAB 基于CPD的点云配准 (24) 一、算法简介二、具体使用1.代码(注释详细)2.函数介绍3.使用技巧4.重复叠加配准效果如何一、算法简介 MATLAB 中包含了一种基于CPD的点云配准方法,这里对其进行使用,查看其配准效果,结果来看如上图所示,还是可用的。 二、具体使用 1.代…

模板类和友元

模板类和友元 非模板友元约束模板友元 非模板友元 友元函数不是模板函数&#xff0c;而是利用模板类参数生成的函数&#xff0c;只能在类内实现。 友元函数访问类的私有变量的方法&#xff1a; 将模板类的引用传递给友元函数&#xff1a; 测试调用&#xff1a; 对于有多个…

Android oom_adj 更新原理(二)

源码基于&#xff1a;Android R 接上一篇&#xff1a;Android oom_adj 更新原理(一) 12. computeOomAdjLocked() frameworks/base/services/core/java/com/android/server/am/OomAdjuster.javaprivate final boolean computeOomAdjLocked(ProcessRecord app, int cachedAdj,Pr…

深入解析Android Lifecycle;从基本使用到源码实现,全面掌握生命周期管理

Lifecycle 是 Android Jetpack 中的一个组件&#xff0c;用于管理 Android 应用组件&#xff08;如 Activity 和 Fragment&#xff09;的生命周期。通过使用 Lifecycle&#xff0c;开发者可以更容易地管理组件的生命周期并执行相关的操作。 Lifecycle 提供了一组生命周期事件&…

关于torch.load()更改了cuda位置还是cuda内存不够的问题

关于torch.load()变了cuda位置还是cuda内存不够的问题 问题背景&#xff1a;在一次任务中&#xff0c;由于需要使用cuda进行代码运行&#xff0c;但是分明修改了cuda到一个空闲的卡位置&#xff0c;但是依然抱错cuda out of memory的问题 在任务中&#xff0c;最开始原始代码是…

Node+mysql-注册和登录账号实现(原生)

1.创建数据表 说明&#xff1a;创建id&#xff0c;username,password字段&#xff0c;并设置了类型。 2.导入mysql库 npm i mysql2.18.1 3.创建了db文件夹 说明&#xff1a;创建mysql数据池 // 导入mysql包 const mysqlrequire("mysql") // 创建mysql连接池 const…

react-flow实现dag工作流

1. 官方文档 Introduction to React Flow 2.效果 3. 代码 index.jsx import { useState, useCallback, useEffect } from react; import ReactFlow, {Controls,Background,applyNodeChanges,applyEdgeChanges,addEdge,ReactFlowProvider,useReactFlow } from reactflow;…

C++编程(二)—— 设计模式

文章目录 单例模式饿汉式单例模式懒汉式单例模式懒汉式单例模式2 工厂模式&#xff08;创建型模式&#xff09;简单工厂工厂方法抽象工厂总结 单例模式 一个类不管创建多少次多线&#xff0c;永远只能得到该类型一个对象的实例。 A* p1 new A(); A *p2 new A(); A *p3 new…

msvcr110.dll丢失的修复教程,找不到msvcr110.dll解决办法哪个更推荐

msvcr110.dll是微软的Visual C运行库文件之一。它是Microsoft Visual Studio 2012的一部分&#xff0c;用于支持运行在Windows操作系统上使用Visual C编写的应用程序。在Windows系统中非常重要&#xff0c;如果丢失或是损坏就会造成很多程序无法启动运行。 会出现以下的报错提…