我正在尝试停止执行此mutate函数。在我调用List.js中的mutate()之后,当我在浏览器中检查网络时,我可以看到mutate始终在执行。我需要执行一次。这是我输出数据的List.js。
import React, {useEffect} from 'react';
import ListItem from './ListItem'
import FetchData from './FetchData';
function List() {
const {
data,
loading,
mutate,
} = FetchData();
//this needs to stop using interval how?
mutate();
return (
<ul>
{loading && <div>Loading</div>}
{!loading && (
<>
{data.map(item => (<ListItem key={item.id} id={item.id} name={item.name} complete={item.complete} />))}
</>
)}
</ul>
)
}
export default List
这是FetchData.js,变异的地方在这里。
import { useEffect, useState} from 'react';
import axios from 'axios';
const FetchData = () => {
const [data, setData] = useState({});
const [loading, setLoading] = useState(true);
const fetchData = async () => {
try {
const { data: response } = await axios.get(
"http://localhost/todolistci/backend/index.php/todos/view",
{ crossDomain: true }
);
setData(response);
} catch (error) {
console.error(error);
}
setLoading(false);
};
const mutate = () => fetchData();
useEffect(() => {
fetchData();
}, []);
return {
data,
loading,
mutate,
};
};
export default FetchData;
我无法停止执行mutate,我需要它停止使用interval如何?这是应用程序的图像。enter image description here
1条答案
按热度按时间qxsslcnc1#
不知道你想用这个mutate函数做什么,但是我可以解释这个问题:
因为mutate()是在组件内部声明的,而不是在useEffect中声明的,所以它将在组件渲染和重新渲染的任何时候被调用。
所以这里发生的事情,按顺序(有点)是:
1.您的组件呈现数据为空{};
1.你的组件有一个useEffect()来获取数据,所以当它第一次呈现时就会被触发。2这很好。
1.与此同时,mutate()被调用,它也执行与use效果中完全相同的fetch调用。
1.现在您有两个并发的API调用被发送出去。
1.一段时间后,两个API调用中的一个首先响应,这对我们的目的来说并不重要。
1.在这个响应上,我们调用setData(...)并更改状态数据值。
1.因为数据改变了,组件重新呈现,这很好。
1.因为我们的组件重新呈现,mutate()被再次调用。哦,不。我们现在再次获取数据,将再次setData(...),数据状态值被更改,我们的组件再次重新呈现...我们陷入了循环。
最重要的是,当两个fetchData()调用中的第二个调用返回时,组件中有一个额外的rerender,但这并不重要,因为无论如何它都是坏的。
如果你去掉了mutate(),我想它可以正常工作?
我不知道变异的目的是什么,除了引起荒谬的行为,所以我不能建议如何解决这个问题。哈哈。