问题
在处理 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 ( <p> <h1>data</h1> <ul> {data.map(item => ( <li key={item.id}>{item.name}</li> ))} </ul> </p> ); }; 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"));
登录后复制
however, it’s better to leave it enabled and adapt your code to handle potential side effects gracefully.
登录后复制
防止重复的 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 ( <p> <h1>Data</h1> <ul> {data.map(item => ( <li key={item.id}>{item.name}</li> ))} </ul> </p> ); }; export default MyComponent;
登录后复制
使用 useref 可确保 api 调用仅发生一次,而不管 strictmode 导致的额外渲染如何。
要点
- react 开发中的严格模式是有意且安全地离开的 上。
- 生产版本不会有这个问题。 3. 必要时使用 useref 或其他技术来管理副作用。
必须的。
};
导出默认的 mycomponent;
使用 useref 可确保 api 调用仅发生一次,而不管 strictmode 导致的额外渲染如何。
要点
。 react 开发中的严格模式是有意为之的,可以安全地保留。
。生产版本不会有这个问题。 。必要时使用 useref 或其他技术来管理副作用。
必要时使用 useref 或其他技术来管理副作用。
生产版本不会有这个问题。
必要时使用 useref 或其他技术来管理副作用。
以上就是为什么我的 React useEffect 钩子即使在依赖项数组为空的情况下也会运行多次?的详细内容,更多请关注抖狐科技其它相关文章!
-
哪个软件抢票能指定下铺
目前有三个软件可以指定下铺抢票:携程、飞猪和12306。其中,携程和飞猪提供自动抢票功能,勾选“下铺”选项即可,而12306只能通过候补购票随机候补下铺。哪个软件能抢到指定下铺车票? 目前市面上可以抢...
-
2021年最值得关注的电脑内存品牌排名
1. 金士顿(Kingston) 金士顿公司是一家全球知名的硬件产品制造商,其内存产品备受好评。不仅在质量上有着出色表现,而且价格相对亲民,深受消费者喜爱。 2. 美光(Micron)...
-
Vue项目报错TypeError: Cannot read properties of undefined (reading \'Vue\'),如何排查?
vue 项目莫名报错,该如何排查? 一位开发人员遇到了一个令人困惑的错误:Uncaught (in promise) TypeError: Cannot read properties of unde...
-
0x0000007e共享打印机是啥意思
共享打印机是指一台连接到网络的打印机,供多位用户使用,优势包括节省成本、提高效率、节省空间、便于管理和远程打印。一般共享打印机步骤为:连接打印机网络、安装打印机驱动程序、启用打印机共享和添加共享打印机...
-
如何通过 JavaScript 获取图片上传后的绝对路径?
获取图片上传后的路径 用户通过 选择图片后,前端可能需要获取其路径。默认情况下, 只会提供文件的名称。 解决方案 可以使用 javascript 获取文件的绝对路径。具体步骤如下: 立即学习“Jav...