javascript - 为什么 useEffect 会运行多次?
问题描述
我正在使用 useEffect 从 API 获取数据。无论我做什么,useEffect 都会运行多次。
const [productDetails, setProductDetails] = useState([]);
useEffect(() => {
fetch(
`url`
)
.then(results => results.json())
.then(results => {
setProductDetails(results);
});
}, []);
我读到您没有在 useEffect 中设置状态,所以我尝试了另一种方法:
const [productDetails, setProductDetails] = useState([]);
useEffect(() => {
fetchAsync();
}, []);
async function fetchAsync() {
// await response of fetch call
let response = await fetch(
`url`
);
// only proceed once promise is resolved
let data = await response.json();
// only proceed once second promise is resolved
setProductDetails(data); // setting state after fetching data
}
在这两种情况下,当我console.log(productDetails);
多次返回结果时,我猜 useEffect 会运行多次。我想到了 useEffect 中的一个错误,并尝试了旧componentDidMount()
的,但它总是一样的。结果多次返回。
是否有 100% 正确的方法来设置 API 调用并只返回一次结果?
解决方案
我很确定问题出在您发布的代码之外。
我猜想包含这个 useEffect 的组件是出于某种原因重新创建的。甚至可能是因为重新创建了父组件(或父-父...)。
推荐阅读
- applescript - 如何使用 applescript 播放主题幻灯片?
- python - TypeError:只有整数标量数组可以转换为标量索引(python)
- networking - Web 服务器在 ServerHello 处挂起,在特定条件下发送截断的 TLS 证书
- javascript - 从 React 中的另一个 js 文件导出函数
- javascript - 将对象元素添加到不可变数组(javascript)
- scala - 如何将 Scala 期货与超时联系起来?
- javascript - 响应式热图
- python - 如何创建两个包含 10 个实例的列表
- node.js - 从数据库中检索单个对象的最佳实践是什么?
- javascript - 本地存储 + 创建上下文