react的严格模式 和 解决react useEffect执行两次

news/2024/7/15 18:38:54 标签: react.js, javascript, 前端

useEffect执行两次


这个问题,主要是刚接触react的时候发的问题,当时也没总结。现在回过头来再总结一次!!!

文章目录

  • useEffect执行两次
  • 前言
  • 一、为什么useEffect执行两次
    • 1.React的严格模式(模版创建项目👇)
    • 2.React的严格模式(StrictMode包裹显渲染组件)
    • 3.React的严格模式作用
      • 作用1:识别不安全的生命周期
      • 作用2:关于使用过时字符串 ref API 的警告
        • 如下图
      • 作用3:关于使用废弃的 findDOMNode 方法的警告
      • 作用4:检测意外的副作用(useEffect副作用)
        • 1.React的工作阶段
        • 2.React严格模式的重复调用
        • 3.Tips
      • 作用5:检测过时的 context API
  • 二、解决useEffect执行两次(删除严格模式)
    • 代码如下
    • 图片如下
    • 关闭严格模式前,如下图:
    • 关闭严格模式后,如下图:
  • 总结


前言

能发现这个问题的👨‍🎓,一定是一名细心并且有一颗求知的❤️。
因为我当时接触React的时候就是这样的想法。为什么会触发两次?按照正常的声明周期应该执行一次的!!!!!

一、为什么useEffect执行两次

1.React的严格模式(模版创建项目👇)

  1. npx create-react-app my-app 创建React项目
  1. npx create-react-app my-app --template typescript 创建typeScript模版的React项目

2.React的严格模式(StrictMode包裹显渲染组件)

javascript">root.render(
  //就是下面的代码 React.StrictMode
  <React.StrictMode>
    <App />
  </React.StrictMode>
);


3.React的严格模式作用

StrictMode 是一个用来突出显示应用程序中潜在问题的工具。StrictMode 不会渲染任何可见的 UI。StrictMode 为其后代元素触发额外的检查和警告。

⚠️严格模式检查仅在开发模式下运行;它们不会影响生产构建。 开发发挥作用、线上会自动屏蔽【StrictMode】

作用1:识别不安全的生命周期

React开发中使用严格模式的作用主要是为了识别 Class组件中一些逐渐废弃的组件生命周期,还有引用的第三方组件库中的一些生命周期方法。

React中使用严格模式,一旦发现有风险的生命周期的使用就会在控制台中提出警告

作用2:关于使用过时字符串 ref API 的警告

refs为字符串的危害⚠️

如下图

在这里插入图片描述

作用3:关于使用废弃的 findDOMNode 方法的警告

findDOMNode 也可用于 class组件,但它违反了抽象原则,它使得父组件需要单独渲染子组件。
它会产生重构危险,你不能更改组件的实现细节,因为父组件可能正在访问它的 DOM节点。

findDOMNode 只返回第一个子节点,但是使用 Fragments,组件可以渲染多个 DOM 节点。findDOMNode是一个只读一次的 API。
调用该方法只会返回第一次查询的结果。如果子组件渲染了不同的节点,则无法跟踪此更改。因此,findDOMNode仅在组件返回单个且不可变的 DOM 节点时才有效。

作用4:检测意外的副作用(useEffect副作用)

1.React的工作阶段

React 分两个阶段工作:

1.渲染阶段: 会确定需要进行哪些更改,比如 DOM。在此阶段,React 调用 render,然后将结果与上次渲染的结果进行比较。

2.提交阶段: 发生在当 React 应用变化时。(对于 React DOM 来说,会发生在 React 插入,更新及删除 DOM 节点的时候。)在此阶段,React 还会调用 componentDidMount 和 componentDidUpdate 之类的生命周期方法。

2.React严格模式的重复调用

严格模式不能自动检测到你的副作用,但它可以帮助你发现它们。通过故意重复调用以下函数来实现的该操作:

class 组件的
constructor、render 、shouldComponentUpdate
组件的生命周期方法: getDerivedStateFromProps

函数组件通过使用 useState,useMemo 或者useReducer

3.Tips

⚠️⚠️⚠️:严格模式采用故意重复调用方法(如组件的构造函数)的方式,使得这种 bug 更容易被发现。

作用5:检测过时的 context API

过时的 context API 容易出错,将在未来的主要版本中删除。在所有 16.x 版本中它仍然有效,但在严格模式下,将显示以下警告:

二、解决useEffect执行两次(删除严格模式)

代码如下

javascript">  //就是下面的代码 React.StrictMode
  // <React.StrictMode>
    <App />
  // </React.StrictMode>

图片如下

在这里插入图片描述

关闭严格模式前,如下图:

在这里插入图片描述

关闭严格模式后,如下图:

在这里插入图片描述

总结

希望本文对你的困惑会有所帮助!!!!!

努力的👨‍🎓(👩‍🎓)运气都不会差,💪💪💪


http://www.niftyadmin.cn/n/107319.html

相关文章

阿尔及利亚COC认证申请办理

阿尔及利亚COC证书阿尔及利亚产品符合性评定方案的符合性证书, 证书的正式名称为Certifcat de Conformite (Certificat de Controle de Qualite des Marchandises)。该计划的首要目标是&#xff1a;1、确保产品符合适用于阿尔及利亚的技术法规和强制性标准&#xff08;或其等值…

【大数据离线开发】8.2 Hive的安装和配置

8.3 Hive的安装和配置 安装模式&#xff1a; 嵌入模式 &#xff1a;不需要使用MySQL&#xff0c;需要Hive自带的一个关系型数据库&#xff1a;Derby本地模式、远程模式 ----> 需要MySQL数据库的支持 安装 hive 安装包 1、解压tar -zxvf apache-hive-2.3.0-bin.tar.gz -C…

vue3与vue2生命周期对比

vue3与vue2生命周期对比 目录 vue3生命周期图&#xff1a; vue2生命周期图&#xff1a; 列表对比&#xff1a; vue3组合式 API&#xff1a;生命周期钩子详解 vue3生命周期图&#xff1a; vue2生命周期图&#xff1a; 列表对比&#xff1a; vue3与vue2生命周期对比vue2vue3b…

常见损失函数Loss Function的选择(regression problem)

损失函数Loss Function的设计是机器学习模型的核心问题&#xff0c;一般情况下函数式子会分成两项&#xff1a;衡量预估值和目标间的差距、正则项式。其中正则项式子一般用于衡量模型的复杂度&#xff0c;可以避免模型过拟合&#xff08;奥卡姆剃刀原理&#xff09;。 另一部分…

Aspect-Based Sentiment Analysis Model with Bi-Guide Attention Network 论文阅读笔记

一、作者 Xie Jun, Wang Yuzhu, Chen Bo, Zhang Zehua, and Liu Qin College of Information and Computer, Taiyuan University of Technology, Jinzhong, Shanxi 二、背景 在应用于方面情感分析的深度神经网络中&#xff0c;序列型神经网络能捕获句子的上下文语义信息&am…

完整的 HTML 元素属性列表(不包括 SVG 和 MathML)

一个 HTML 元素由以下几个部分构成&#xff1a; 起始标签&#xff08;opening tag&#xff09;&#xff1a;由一个左尖括号&#xff08;<&#xff09;和紧随其后的标签名组成&#xff0c;标记元素的开始。属性&#xff08;attributes&#xff09;&#xff1a;位于起始标签中…

mysql lesson5

1:约束 #唯一性的约束 举例&#xff1a; create table t_user(-> id int,-> username varchar(255) uniqueinsert into t_user values(1,zhangsan);insert into t_user values(2,zhangsan) insert into t_user(id) values&#xff08;2&#xff09;&#xff1b;inser…

【微信小程序】-- WXML 模板语法 - 列表渲染 -- wx:for wx:key(十二)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…