【发布时间】:2021-06-22 00:16:39
【问题描述】:
我想通过调用映射通过数组(从数据库调用)的函数来更新 useState 数组值,并且将为(数据库数组)中的每个项目更新 useState 数组,所以我尝试了以下方法:
const [snapshots, setSnapshots] = useState();
const [items, setItems] = useState([]);
// *** get from the database ***** //
useEffect(()=> {
db.collection("users").doc("4sfrRMB5ROMxXDvmVdwL").collection("basket")
.get()
.then((snapshot) => {
setSnapshots(snapshot.docs)
}
) ;
}, []);
// *** get from the database ***** //
// *** update items value ***** //
return <div className="cart__items__item">
{snapshots && snapshots.map((doc)=>(
setItems([...items, doc.data().id]),
console.log(items)
))
}
</div>
// *** update items value ***** //
但出现以下错误:
Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.
我尝试console.log 来查看结果以查看问题,并且Items 数组连续记录在控制台中我尝试将代码包含在useEffect 中,但效果不佳。
【问题讨论】:
-
useEffect(()=>{setItems(“updated value”)},[ ]) 这可能应该有效。传递空依赖数组,使其仅在挂载后运行(运行一次)
-
不要在渲染函数中改变状态。通常,您将其称为对用户操作(事件)的反应,或在道具突变后的 useEffect 内。通过直接在渲染函数中调用它,您就是在递归调用函数本身。
-
请用minimal reproducible example 更新您的问题来证明问题,最好是使用堆栈片段(
[<>]工具栏按钮)可运行。 Stack Snippets 支持 React,包括 JSX; here's how to do one. -
这里不需要调用setState,你已经在useState中设置了它的值。您在这里所做的只是创建一个无限循环。
标签: javascript arrays reactjs use-effect use-state