React 挂钩上无限调用 API 的问题
Problem with infinite call API on React hooks
嗨,我尝试用材质 ui 在 React Hooks 中制作一个带有过滤器的网格。
到目前为止,我创建了网格、过滤器选项、API 调用的方法,一切正常,但我的 API 是无限循环调用。
这是我的 API 电话:
const HeadQuartersGet = async (filterOptions) => {
var url = HEADQUARTERS_API_URL +"/isActiv&headQuartersName&headQuartersCode";
url = InsertParamsToURL(url, filterOptions);
var data = [];
async function fetchData()
{
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
var requestOptions =
{
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
var json = await fetch(url, requestOptions)
.then(response => { return response.json(); })
.then(result => { return result; })
.catch(error => { return error; })
data = json;
}
await fetchData();
return data;
};
为了获取数据并写入网格,我使用了这个:
const [data, setData] = useState({});
HeadQuartersGet(filterOptions).then(result =>{ setData(result); });
var rows = [];
for (var i = 0; i<data.length - 1; i++)
for(var j = 0; j<data[0].length; j++)
rows.push(createData(data[i][j].id, data[i][j].headQuartersName, data[i][j].headQuartersCode, data[i][j].headQuartersDescription, data[i][j].longitute, data[i][j].latitude, data[i][j].isActiv));
function createData(HeadQuartersId, HeadQuartesName, HeadQuartersCode, HeadQuartersDescription, IsActiv) {
return { HeadQuartersId, HeadQuartesName, HeadQuartersCode, HeadQuartersDescription, IsActiv };
}
对于我使用的过滤器:
const [filterOptions, setFilterOptions] = useState({isActiv: '1'});
const onChangeFilters = e => {
setFilterOptions({ ...filterOptions, [e.target.name]: e.target.value })
}
const submitFilterOptions = e =>{
e.preventDefault();
}
我的过滤方法现在不起作用,因为 DOM 正在无限循环中渲染,当在过滤器中给定一个值时,他无论如何都会过滤。
有人可以帮我解决无限循环吗?
更新状态值会触发重新渲染。
由于您正在执行 API 调用并更新状态,您的组件正在重新渲染,再次执行 API 调用并陷入此无限循环。
解决方法:
像这样将你的 API 调用移动到 useEffect 钩子中。
useEffect(() => {
HeadQuartersGet(filterOptions).then(result =>{ setData(result); });
return () => {
// cancel your api calls here so that there won't be any data leaks
}
}, []);
以上代码将获取您想要的数据,并在您的组件安装后更新一次状态。
嗨,我尝试用材质 ui 在 React Hooks 中制作一个带有过滤器的网格。 到目前为止,我创建了网格、过滤器选项、API 调用的方法,一切正常,但我的 API 是无限循环调用。
这是我的 API 电话:
const HeadQuartersGet = async (filterOptions) => {
var url = HEADQUARTERS_API_URL +"/isActiv&headQuartersName&headQuartersCode";
url = InsertParamsToURL(url, filterOptions);
var data = [];
async function fetchData()
{
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
var requestOptions =
{
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
var json = await fetch(url, requestOptions)
.then(response => { return response.json(); })
.then(result => { return result; })
.catch(error => { return error; })
data = json;
}
await fetchData();
return data;
};
为了获取数据并写入网格,我使用了这个:
const [data, setData] = useState({});
HeadQuartersGet(filterOptions).then(result =>{ setData(result); });
var rows = [];
for (var i = 0; i<data.length - 1; i++)
for(var j = 0; j<data[0].length; j++)
rows.push(createData(data[i][j].id, data[i][j].headQuartersName, data[i][j].headQuartersCode, data[i][j].headQuartersDescription, data[i][j].longitute, data[i][j].latitude, data[i][j].isActiv));
function createData(HeadQuartersId, HeadQuartesName, HeadQuartersCode, HeadQuartersDescription, IsActiv) {
return { HeadQuartersId, HeadQuartesName, HeadQuartersCode, HeadQuartersDescription, IsActiv };
}
对于我使用的过滤器:
const [filterOptions, setFilterOptions] = useState({isActiv: '1'});
const onChangeFilters = e => {
setFilterOptions({ ...filterOptions, [e.target.name]: e.target.value })
}
const submitFilterOptions = e =>{
e.preventDefault();
}
我的过滤方法现在不起作用,因为 DOM 正在无限循环中渲染,当在过滤器中给定一个值时,他无论如何都会过滤。
更新状态值会触发重新渲染。
由于您正在执行 API 调用并更新状态,您的组件正在重新渲染,再次执行 API 调用并陷入此无限循环。
解决方法: 像这样将你的 API 调用移动到 useEffect 钩子中。
useEffect(() => {
HeadQuartersGet(filterOptions).then(result =>{ setData(result); });
return () => {
// cancel your api calls here so that there won't be any data leaks
}
}, []);
以上代码将获取您想要的数据,并在您的组件安装后更新一次状态。