首页 > web前端 > js教程 > 为什么我的 React useEffect 钩子即使在依赖项数组为空的情况下也会运行多次?

为什么我的 React useEffect 钩子即使在依赖项数组为空的情况下也会运行多次?

Linda Hamilton
发布: 2024-12-21 04:23:10
原创
1055 人浏览过

Why does my React useEffect hook run multiple times even with an empty dependency array?

问题
在处理 React 项目时,我遇到了 useEffect 挂钩的问题。我的目标是在组件安装时仅从 API 获取数据一次。然而,即使我提供了一个空的依赖项数组,useEffect 仍然运行多次。

这是代码片段:

import React, { useEffect, useState } from "react";
import axios from "axios";

const MyComponent = () => {
  const [data, setData] = useState([]);

  useEffect(() => {
    console.log("Fetching data...");
    axios.get("https://jsonplaceholder.typicode.com/posts")
      .then(response => setData(response.data))
      .catch(error => console.error(error));
  }, []);
  return (
    <div>
      <h1>Data</h1>
      <ul>
        {data.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
    </div>
  );
};
export default MyComponent;
登录后复制


尽管依赖项数组 ([]) 为空,但 useEffect 仍被执行了多次。我尝试重新启动开发服务器,但问题仍然存在。经过一些研究和故障排除后,我确定了根本原因并解决了它。
答案

为什么会发生这种情况

严格的开发模式:

如果您的应用程序在启用了 StrictMode 的 React 开发模式下运行,React 会故意多次挂载和卸载组件。这是一种仅限开发的行为,旨在检测可能导致问题的副作用。

重新渲染或热模块替换(HMR):

开发过程中,代码的变更可能会触发模块热替换,导致组件重新渲染,useEffect再次执行。

如何修复或处理此行为

识别严格模式:

如果您使用 StrictMode,请了解此行为仅发生在开发中,不会影响生产构建。您可以通过删除
来暂时禁用它

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
ReactDOM.render(<App />, document.getElementById("root"));  
登录后复制


但是,最好保持其启用状态并调整您的代码以优雅地处理潜在的副作用。

防止重复的 API 调用:

使用标志来确保 API 调用在组件的生命周期内只发生一次,甚至

import React, { useEffect, useState, useRef } from "react";
import axios from "axios";

const MyComponent = () => {
  const [data, setData] = useState([]);
  const isFetched = useRef(false);

  useEffect(() => {
    if (isFetched.current) return;

    console.log("Fetching data...");
    axios.get("https://api.example.com/data")
      .then(response => setData(response.data))
      .catch(error => console.error(error));

    isFetched.current = true;
  }, []);

  return (
    <div>
      <h1>Data</h1>
      <ul>
        {data.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
    </div>
  );
};
export default MyComponent;
登录后复制

使用 useRef 可确保 API 调用仅发生一次,而不管 StrictMode 导致的额外渲染如何。

要点
。 React 开发中的严格模式是有意为之的,可以安全地保留。
。生产版本不会有这个问题。 。必要时使用 useRef 或其他技术来管理副作用。
必要时使用 useRef 或其他技术来管理副作用。
生产版本不会有这个问题。
必要时使用 useRef 或其他技术来管理副作用。

以上是为什么我的 React useEffect 钩子即使在依赖项数组为空的情况下也会运行多次?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板