useEffect 为什么在每次渲染后都执行?
我在组件里用 useEffect 做数据请求,但发现每次 state 更新它都会重新跑一遍,明明只希望在组件挂载时调一次。我试过不加依赖数组,也试过加空数组,但行为还是不对,是不是哪里理解错了?
比如下面这段代码,点击按钮更新 count 后,useEffect 里的 log 又打印了:
useEffect(() => {
console.log('fetching data...');
// 模拟请求
}, []); // 这里用了空依赖数组啊
const [count, setCount] = useState(0);
pre class="pure-highlightjs line-numbers">
import React, { useEffect, useState } from 'react';
function MyComponent() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log('fetching data...');
// 模拟请求
}, []); // 注意这里空数组
return (
Count: {count}
);
}
export default MyComponent;
如果这个还是一样有问题,可能是其他地方影响了。再仔细检查一下整个组件的代码吧。
你说的情况可能是这两个原因之一:
第一,React 18 严格模式在开发环境下会故意挂载-卸载-再挂载一次,用来检测副作用是否正确清理。如果你用了空依赖数组的 effect,你会看到两次 "fetching data...",这是开发模式的特性,生产环境不会这样。
第二,也是更可能的情况——你可能有两个 useEffect,其中一个有依赖 count,或者组件本身被重新挂载了。
你可以这样验证一下:
这样分开写,你就能看清楚是哪个 effect 在执行。
如果你是想在组件挂载时请求数据,然后用空数组就可以了,別担心。开发环境看到两次 log 的话,加上这个就能解决:
如果还不是这个问题,把完整的组件代码贴出来,我帮你看看。