[英]React UseEffect is being calling twice
我在 FC 组件中有以下代码:
我只想调用 Api 并在安装组件时记录信息
为空数组调用了两次 console.log,为设置相同的值调用了两次。
import * as React from"react";
import Header from"../components/Header";
import Search from"../components/Search";
import Categories from"../components/Categories";
import Carousel from"../components/Carousel";
import CarouselItem from"../components/CarouselItem";
import Footer from"../components/Footer";
import "../assets/styles/App.scss";
const App = () => {
const [videos, setVideos] = React.useState([]);
React.useEffect(() => {
fetch("http://localhost:3000/initalState")
.then((response) => response.json())
.then((data) => setVideos(data));
}, []);
console.log(videos);
return (
<div className="App">
<Header></Header>
<Search></Search>
<Categories title="Mi Lista">
<Carousel>
<CarouselItem />
<CarouselItem />
<CarouselItem />
<CarouselItem />
<CarouselItem />
</Carousel>
</Categories>
<Categories title="Tendencias">
<Carousel>
<CarouselItem />
<CarouselItem />
</Carousel>
</Categories>
<Categories title="Originales de Platzi Video">
<Carousel>
<CarouselItem />
</Carousel>
</Categories>
<Footer />
</div>
);
};
export default App;
但是,我得到了以下 output:
在 useEffect 中调用:
React.useEffect(() => {
fetch("http://localhost:3000/initalState")
.then((response) => response.json())
.then((data) => {
setVideos(data);
console.log(videos);
});
}, []);
返回一个空数组。
我刚刚意识到我正在以严格模式渲染 App,它会调用一些事件两次:
严格模式不能自动为您检测副作用,但它可以通过使它们更具确定性来帮助您发现它们。 这是通过有意双重调用以下函数来完成的:
Class component constructor, render, and shouldComponentUpdate methods Class component static getDerivedStateFromProps method Function component bodies State updater functions (the first argument to setState) Functions passed to useState, useMemo, or useReducer
我有这个:
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById("root")
);
现在
ReactDOM.render(<App />, document.getElementById("root"));
解决了。
您可以使用 UseCallback 来避免额外运行下面是示例代码。
注意:如果在 use 效果中直接调用 setTimeout/server 调用,没有包装在useCallback
中,会被调用两次
const App = () => {
const [myData, setMyData] = React.useState([]);
const getData = useCallback ( () => {
setTimeout(() => {
console.log("Inside setTimeOut");
setMyData("HEllo");
}, 2000);
}, [] )
useEffect(() => {
getData()
console.log("Inside UseEffect",myData);
},[getData]);
return (
<div className="App">
Inside my App {myData}
</div>
);
}
export default App;
Output:
Inside UseEffect [printed just once]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.