我有一个包含多个 ChildComponent 标签的页面,我希望每个 ChildComponent 都被告知要根据用户单击的 ChildComponent 来调用哪个 API。 onClick() 将打开一个模式。
我注意到,当模态框打开时,API 调用会进行两次。当我关闭模态框时,将再次进行 API 调用。
我从这篇文章中了解到,React 的行为是正确的 - 在 React 功能组件中多次调用函数
是否有另一种方法来构建这个,以便只有一个 axios API 调用一次?
const [posts, setPosts] = useState([]);
export default function ParentComponent() {
const fetchPosts = useCallback(async () => {
try {
const result = await axios(`https://jsonplaceholder.typicode.com/posts`);
setPosts(result.data.data);
} catch (error) {
console.log(error);
}
}, []);
}
<ChildComponent
fetchPosts={fetchPosts}
onClick={handleOnclick}
/>
const ChildComponent = ({ fetchPosts }) => {
useEffect(
() => props.fetchPosts,
[props.fetchPosts]
);
}
export default memo(ChildComponent); Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
如果您使用的是 React 18,则反应性中会出现此错误,请检查此帖子 https://taig.medium.com/prevent-react-from-triggering-useeffect-twice-307a475714d7
如果我很好地理解您的问题和任务,我会尝试编写我的解决方案。
由于您在父组件上有模态控制状态,每次更改时都会触发您的父组件重新渲染,并且您的子组件也会重新渲染,并且由于函数是 JS 中的对象,因此您的 fetch 函数每次都会有不同的链接重新渲染并且您在 ChildComponent 中的 useEffect 会认为您的函数已更改。
所以,我认为最好的解决方案是为您的子组件添加备忘录,例如
export default memo(ChildComponent)(您可以从“react”导入备忘录)。之后,您应该使用 useCallback 包装 fetchPosts 和 handleOnclick。你会得到类似的东西const fetchPosts = useCallback(() => doSomething(), [])希望有帮助。