我知道同样的问题可能被问了很多次,但我还是找不到我想要的答案。
这是任务的代码:
import Navbar from './Navbar';
import "./Idea.css";
import GetData from '../restApiMethods/GetData';
import React from "react";
function Task() {
const ids = GetData("ideas/id");
return (
<div>
<Navbar />
<div className="idea-design">
<div className="container">
{
ids.map((id,index) => {
return (
<div key={index}>
{
GetData(`ideas/${id}`).map((task,index) => {
return(
<div key={index} className="row border border-secondary">
<div className="col">
<div>
<p>{task.taskDescription}</p>
</div>
</div>
</div>
)
})
}
</div>
)
})
}
</div>
</div>
</div>
)
}
export default Task
获取数据函数:
import axios from "axios";
import {useState, useEffect} from "react";
function GetData(data) {
const [datas, setDatas] = useState([]);
useEffect(() =>{
const fetchData = () => {
axios.get(`http://localhost:8080/api/${data}`).then(res =>{
console.log(res);
setDatas(res.data);
});
};
fetchData();
}, []);
return datas;
}
export default GetData
如果有人能给予我为什么会出现此错误:渲染比上一次渲染更多的挂钩,将非常有帮助。
1条答案
按热度按时间swvgeqrz1#
GetData
实际上是custom hook,因为它是一个调用钩子的函数。它应该被称为
useGetData
--我将在这个答案中引用它。你不能在循环中调用它,因为当ids
数组改变长度时,对useGetData
的调用次数将在父组件Task
中改变。这在React中是不允许的,因为钩子应该是可预测的顺序,并且永远不会改变--它是一个声明性模型。要解决这个问题,请创建一个名为
Task
的新组件(将当前组件重命名为Tasks
或任何对您有意义的名称),并在其中调用它一次。这并不违反钩子的规则,因为只有 * 在一个组件内 *,调用次数才不能在渲染之间改变。工作
工作
第一次