在功能反应组件中无限重新渲染
Infinite re-render in functional react component
我正在尝试设置变量“工作区”的状态,但是当我在控制台记录数据时出现无限循环。我在 useEffect() 内部调用 axios“get”函数,并在这个循环之外调用控制台日志记录,所以我不知道是什么触发了所有重新渲染。我没有在 this question 中找到我的具体问题的答案。这是我的代码:
function WorkspaceDynamic({ match }) {
const [proposals, setProposals] = useState([{}]);
useEffect(() => {
getItems();
});
const getItems = async () => {
const proposalsList = await axios.get(
"http://localhost:5000/api/proposals"
);
setProposals(proposalsList.data);
};
const [workspace, setWorkspace] = useState({});
function findWorkspace() {
proposals.map((workspace) => {
if (workspace._id === match.params.id) {
setWorkspace(workspace);
}
});
}
有没有人看到可能导致重新渲染的原因?谢谢!
您对 useEffect 的使用不正确。如果你的依赖数组是空的,它会在每次任何状态数据改变时被调用。结果你的 useEffect
被调用导致 setProposals
然后它再次导致 useEffect
到 运行 和等等
试试这个
useEffect(() => {
getItems();
} , []); // an empty array means it will be called once only
效果挂钩 运行 每个渲染周期,没有依赖数组的效果钩子将在每个渲染周期执行其回调。如果效果回调更新状态,即 proposals
,则另一个渲染周期被排队,从而创建渲染循环。
如果你只想运行在组件挂载时生效一次,那么使用一个空的依赖数组。
useEffect(() => {
getItems();
}, []);
如果您希望它仅在特定时间 运行,例如匹配参数更新,则在数组中包含一个依赖项。
useEffect(() => {
getItems();
}, [match]);
我认为是这样的:useEffect
应该有第二个参数 []
以确保它只执行一次。即:
useEffect(() => {
getItems();
}, []);
否则 setProposal
将修改状态,这将触发 re-render,这将调用 useEffect
,这将进行异步调用,这将 setProposal
,。 ..
我正在尝试设置变量“工作区”的状态,但是当我在控制台记录数据时出现无限循环。我在 useEffect() 内部调用 axios“get”函数,并在这个循环之外调用控制台日志记录,所以我不知道是什么触发了所有重新渲染。我没有在 this question 中找到我的具体问题的答案。这是我的代码:
function WorkspaceDynamic({ match }) {
const [proposals, setProposals] = useState([{}]);
useEffect(() => {
getItems();
});
const getItems = async () => {
const proposalsList = await axios.get(
"http://localhost:5000/api/proposals"
);
setProposals(proposalsList.data);
};
const [workspace, setWorkspace] = useState({});
function findWorkspace() {
proposals.map((workspace) => {
if (workspace._id === match.params.id) {
setWorkspace(workspace);
}
});
}
有没有人看到可能导致重新渲染的原因?谢谢!
您对 useEffect 的使用不正确。如果你的依赖数组是空的,它会在每次任何状态数据改变时被调用。结果你的 useEffect
被调用导致 setProposals
然后它再次导致 useEffect
到 运行 和等等
试试这个
useEffect(() => {
getItems();
} , []); // an empty array means it will be called once only
效果挂钩 运行 每个渲染周期,没有依赖数组的效果钩子将在每个渲染周期执行其回调。如果效果回调更新状态,即 proposals
,则另一个渲染周期被排队,从而创建渲染循环。
如果你只想运行在组件挂载时生效一次,那么使用一个空的依赖数组。
useEffect(() => {
getItems();
}, []);
如果您希望它仅在特定时间 运行,例如匹配参数更新,则在数组中包含一个依赖项。
useEffect(() => {
getItems();
}, [match]);
我认为是这样的:useEffect
应该有第二个参数 []
以确保它只执行一次。即:
useEffect(() => {
getItems();
}, []);
否则 setProposal
将修改状态,这将触发 re-render,这将调用 useEffect
,这将进行异步调用,这将 setProposal
,。 ..