【发布时间】:2021-09-29 03:40:11
【问题描述】:
为什么这个简单的代码会导致 无限循环渲染 Projects 组件 及其子组件(自然而然)并且因为 useEffect 无限循环访问 firebase? 使用已导入 useProjects 自定义钩子的 contextProvider 管理状态。
自定义钩子:
export const useProjects = () => {
const [projects, setProjects] = useState([]);
useEffect(() => {
const db = firebase
.firestore()
.collection("projects")
.where("userId", "==", "1234567890")
.orderBy("projectId")
.get();
db.then((result) => {
const allProjects = result.docs.map((project) => ({
docId: project.id,
...project.data(),
}));
if (JSON.stringify(allProjects) !== JSON.stringify(projects)) {
setProjects(allProjects);
}
}).catch((err) => {
console.log("useProjects error", err);
});
}, [projects]);
return { projects, setProjects };
};
项目组件:
const Projects = () => {
const [active, setActive] = useState(null);
const { setSelectedProject } = useSelectedProjectValue();
const { projects } = useProjectsValue();
return (
projects &&
projects.map((project) => (
<li
key={Math.random()}
className={
active === project.projectId
? "sidebar__project active"
: "sidebar__project"
}
>
<div
onClick={() => {
setActive(project.projectId);
setSelectedProject(project.projectId);
}}
>
<IndividualProject
className="individualProjectComp"
project={project}
/>
</div>
</li>
))
);
};
【问题讨论】:
标签: javascript reactjs infinite-loop use-effect context-api