鑫鑫之鈥 發表於 2024-3-23 10:46:00

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

<p>当我们在函数组件中,希望使用 <code>useEffect</code> 来达到初始化的目的时,会发现总是在初始化的时候执行两遍</p>
<h1 id="问题复现">问题复现</h1>
<h2 id="组件代码部分">组件代码部分</h2>
<pre><code class="language-tsx">import "./assets/App.css";
import { useEffect } from "react";

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

export default App;
</code></pre>
<p>上面的组件只是在初始化的时候打印了一段字符串</p>
<h2 id="入口文件">入口文件</h2>
<pre><code class="language-tsx">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(
    &lt;React.StrictMode&gt;
      &lt;App /&gt;
    &lt;/React.StrictMode&gt;,
);
</code></pre>
<h2 id="现象">现象</h2>
<p>访问页面,查看控制台</p>
<p><img src="https://img2024.cnblogs.com/blog/2908207/202403/2908207-20240323103104523-1071380260.png" alt="" loading="lazy"></p>
<p>会发现执行了两次</p>
<h1 id="解决办法">解决办法</h1>
<h2 id="1关闭严格模式">1、关闭严格模式</h2>
<pre><code class="language-tsx">//就是下面的代码 React.StrictMode
// &lt;React.StrictMode&gt;
    &lt;App /&gt;
// &lt;/React.StrictMode&gt;
</code></pre>
<p>严格模式(Strict Mode)是 React 中的一种特殊的组件,它用于在开发模式下检测潜在的问题。</p>
<p>当你将一个组件包裹在 <code>&lt;React.StrictMode&gt;</code> 标签中时,React 会对该组件及其子组件进行多次渲染,以检测潜在的问题。这些问题可能包括使用已废弃的 API、依赖不稳定的生命周期方法、以及在渲染过程中产生副作用等。</p>
<p>严格模式的主要目的是帮助开发者发现和修复潜在的问题,以便在生产模式下运行的应用能够更加稳定和高效。然而,需要注意的是,严格模式只在开发模式下生效,在生产模式下不会产生任何影响。</p>
<p>所以,也可以不用管这个问题。毕竟正式环境不会出现。</p>
<p>如果想解决,只需要,移除 <code>&lt;React.StrictMode&gt;</code> 组件</p>
<h2 id="2借助useref解决">2、借助useRef解决</h2>
<p>可以通过设置一个flag来解决</p>
<pre><code class="language-tsx">import "./assets/App.css";
import { useEffect, useRef } from "react";

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

export default App;
</code></pre>
<p>通过设置flag,</p>
<p>当第一次执行后,就把flag关掉,就不会再执行了</p>


</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/18090867</p><br><br>
来源:https://www.cnblogs.com/guangdelw/p/18090867
頁: [1]
查看完整版本: 解决react useEffect中的内容被执行两次的问题