【发布时间】:2021-03-18 02:46:45
【问题描述】:
我是 Hooks 的新手。我用componentDidMount编写了一个项目。
现在我正在学习钩子并用钩子重写这个项目。我想先获取数据并在控制台上打印。
但是,它渲染了 3 次。可能是因为我在useEffect中使用了2个setState。但是,在其中一个中,我将数据设置为数据数组,而在另一个中,我保留了微调控件的加载值。我怎样才能像componentDidMount 一样使用useEffect 一次来提取数据并设置我的状态?
当我将控制台写入useEffect 时,“React Hook useEffect 缺少依赖项:'data'。”警告并返回一个空列表。
顺便说一句,我删除了严格模式。
import React, { useState, useEffect } from "react";
import axios from "axios";
function App() {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
const fetchData = async () => {
const { data } = await axios.get("/data/data.json");
setData(data);
setLoading(false);
};
fetchData();
}, []);
console.log(data);
return <div className="App">App</div>;
}
export default App;
【问题讨论】:
-
useEffect没有多次运行,它是重新渲染的组件。重新渲染本质上没有任何问题,但在这种情况下,流程是 (1) 组件渲染 (2) useEffect 运行,调用fetchData(3)fetchData调用setData(4) 组件第二次渲染,因为 @ 987654334@ 已更改。 -
这段代码工作正常吗?我怎样才能运行一次?
-
看来是正确的。多次调用您的
console.log不是错误,这是意料之中的。 -
您有两个
data变量(一个来自useState,一个用于API 调用)。这可能会导致冲突。我建议更改一个名称。 -
&GalAbra 我认为您就像问题所有者一样感到困惑......再次阅读 cmets..
标签: javascript reactjs react-hooks use-effect use-state