首页 > 其他分享 >解决react useEffect中的内容被执行两次的问题

解决react useEffect中的内容被执行两次的问题

时间:2024-03-23 10:55:25浏览次数:22  
标签:App 两次 react flag 组件 import useEffect

当我们在函数组件中,希望使用 useEffect 来达到初始化的目的时,会发现总是在初始化的时候执行两遍

问题复现

组件代码部分

import "./assets/App.css";
import { useEffect } from "react";

const App = () => {
    useEffect(() => {
        console.log("组件初始化");
    }, []);
    return (
        <>
            <div>test</div>
        </>
    );
};

export default App;

上面的组件只是在初始化的时候打印了一段字符串

入口文件

import * as React from "react";
import * as ReactDOM from "react-dom/client";
import "~/assets/index.css";
import { HashRouter } from "react-router-dom";

import App from "~/App.tsx";

ReactDOM.createRoot(document.getElementById("root")!).render(
    <React.StrictMode>
        <App />
    </React.StrictMode>,
);

现象

访问页面,查看控制台

会发现执行了两次

解决办法

1、关闭严格模式

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

严格模式(Strict Mode)是 React 中的一种特殊的组件,它用于在开发模式下检测潜在的问题。

当你将一个组件包裹在 <React.StrictMode> 标签中时,React 会对该组件及其子组件进行多次渲染,以检测潜在的问题。这些问题可能包括使用已废弃的 API、依赖不稳定的生命周期方法、以及在渲染过程中产生副作用等。

严格模式的主要目的是帮助开发者发现和修复潜在的问题,以便在生产模式下运行的应用能够更加稳定和高效。然而,需要注意的是,严格模式只在开发模式下生效,在生产模式下不会产生任何影响。

所以,也可以不用管这个问题。毕竟正式环境不会出现。

如果想解决,只需要,移除 <React.StrictMode> 组件

2、借助useRef解决

可以通过设置一个flag来解决

import "./assets/App.css";
import { useEffect, useRef } from "react";

const App = () => {
    const flag = useRef<boolean>(true);
    useEffect(() => {
        if (flag.current) {
            flag.current = false;
            return;
        }
        console.log("组件初始化");
    }, []);
    return (
        <>
            <div>test</div>
        </>
    );
};

export default App;

通过设置flag,

当第一次执行后,就把flag关掉,就不会再执行了

标签:App,两次,react,flag,组件,import,useEffect
From: https://www.cnblogs.com/guangdelw/p/18090867

相关文章

  • 【React 】如何提高组件的渲染效率?在React中如何避免不必要的render?
    1.是什么react基于虚拟DOM和高效Diff算法的完美配合,实现了对DOM最小粒度的更新,大多数情况下,React对DOM的渲染效率足以我们的业务日常复杂业务场景下,性能问题依然会困扰我们。此时需要采取一些措施来提升运行性能,避免不必要的渲染则是业务中常见的优化手段之一2.如何做......
  • vue或react项目上线刷新出现404的原因以及解决办法
    问题描述:vue/react项目,正常的页面操作跳转,不会出现404的问题,但是一旦刷新,就会出现404报错。产生原因:我们打开vue/react打包后生成的dist文件夹,可以看到只有一个index.html文件及一些静态资源,这个是因为vue/react是单页应用(SPA),只有一个index.html作为入口文件,其它的路由都是通......
  • react 版本比对的库
     react版本比对的库React本身不提供版本比对的库,但是你可以使用第三方库 semver 来进行版本比较。semver 是一个用于处理语义版本(SemanticVersioning)的库,它提供了一系列的方法来比较版本号。首先,你需要安装 semver 库:  npminstallsemver然后,你可......
  • 4年前的React老项目打包报错解决问题处理过程
    处理公司一个4年前React应用时,发现打包编译时会出现如题错误:Failedtominifythebundle.Error:index.71782de2.jsfromUglify]s  查看打包编译后源码错误位置: 经过bing搜索引擎查找类似解决方式: https://github.com/sorrycc/blog/issues/68 1、npm安装 https://g......
  • React配置Eslint
    Eslint的配置相对复杂一点,记录一下项目中使用的配置,以备后续查阅。1.下载Eslint插件并在webpack的配置文件中声明、初始化constEslintWebpackPlugin=require("eslint-webpack-plugin");plugins:[//eslint用于代码规范检查,作用相当于js的编译器//esl......
  • react router v6实现嵌套路由
    做一个简单的笔记有两种方式可以实现使用标签BrowserRouter来实现使用APIcreateBrowserRouter来实现注意:createBrowserRouter是6.4版本才引入的这是官方文档注意,这两个是不兼容的使用标签BrowserRouter来实现创建路由//src/router/index.tsxconstrouter=[......
  • react router v6报错 useRoutes() may be used only in the context of a <Router> comp
    在使用reactrouterv6版本的时候,按照之前的方法使用src/main.tsx是这样的,几乎不动import*asReactfrom"react";import*asReactDOMfrom"react-dom/client";import"~/assets/index.css";importAppfrom"~/App.tsx";ReactDOM.createRoot(......
  • Angular React Vue 比较 – 模板篇
    如果我们把组件篇比做是前端的JavaScript,那么模板篇则是HTML。三大框架中的模板在应用中呈现用户界面,就像常规HTML一样,但是它具有更多功能。Angular的模板在Angular中,*template* 是HTML的一个块。在模板中我们可以使用Angular的语法来构建更多的功能。编写......
  • React函数组件Hook
    问题:相对于类组件,函数组件的编码更简单,效率也更高,但函数组件不能有state(旧版)解决:React16.8版本设计了一套新的语法来让函数组件也可以有stateHook是React16.8的新增特性。它可以让你在不编写class的情况下使用state以及其他的React特性Hook也叫......
  • react 开发一个 类似于条件筛选的组件 如下
     最终效果: 记录一下其中要点: 1.react 的数据被useState后,都不允许直接修改,都需要使用hooks才可以修改       2. useState必须要放到组件渲染函数中     3. 在jsx中不允许使用if 除了三元运算符和isChecked为真假来做标识符外......