我正在构建一个Ionic 7,React 18应用程序,在理解基本的useEffect原则时遇到了一些麻烦。
setupIonicReact();
const App: React.FC = () => {
useEffect(() => {
console.log("Loading user profile info in app..." + new Date().getUTCMilliseconds());
UserService.getProfile()
.then((user) => {
console.log("User: " + JSON.stringify(user));
})
.catch((error) => {
console.error("Error fetching profile:", error);
});
}, []);
return (
<IonApp>
<IonReactRouter>
<IonHeader>
<IonToolbar>
<IonButtons slot="start">
<IonButton>
<IonIcon icon={logoReact} />
</IonButton>
</IonButtons>
<IonTitle>LOL Greetings</IonTitle>
<IonButtons slot="end">
<IonButton>
<IonIcon icon={search} />
</IonButton>
<IonButton>
<IonIcon icon={personCircle} />
</IonButton>
</IonButtons>
</IonToolbar>
<IonToolbar>
<CategorySelectComponent />
</IonToolbar>
</IonHeader>
<IonContent className="ion-padding" scroll-y>
Test
</IonContent>
</IonReactRouter>
</IonApp>
);
};
export default App;
字符串
这是从我的mainn.tsx文件中调用的
const container = document.getElementById("root");
const root = createRoot(container!);
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
型
问题是我注意到“useEffect”被调用了两次(我可以看到两次对我的UserProfile.getProfile”调用的调用。我如何确保它只被调用一次?我以为传递一个空的依赖数组可以确保useEffect只执行一次,但我想我错了。
2条答案
按热度按时间cunj1qz11#
不用担心,因为您已经使用了
<StrictMode>
,所以您的组件将重新运行特效一段额外的时间,以查找由于缺少特效清理而导致的错误。在您的生产版本中,您的特效将只运行一次。请参阅https://react.dev/reference/react/StrictMode。
ippsafx72#
这是因为严格模式。它不会在生产构建中触发两次,但会在开发模式中触发两次。它没有任何危险,但提供了一些好处来捕捉一些错误。总而言之,不要在意:)