使用React、Redux和Firebase的无限循环

sg24os4d  于 2022-11-12  发布在  React
关注(0)|答案(2)|浏览(150)

我在firebase中有一个配置文件文档集合,我想在配置文件页面中呈现它们,但是在我更新了userProfiles状态并使用useDispatch将状态存储在切片中之后,在呈现配置文件页面时,我会遇到一个无限循环。
我已经尝试将dispatch()放入useEffect中,而不是放在useEffect和querySnapshot承诺中,但无论放在哪里,我仍然会得到一个无限循环。
感谢您发送编修。
第一个

hpcdzsge

hpcdzsge1#

在当前的实现中,当您的页面被渲染时,db.collections会运行,您设置状态setUserProfiles(documents)来渲染您的应用,然后db.collections会再次运行。为了防止出现这种情况,您应该在useEffect中运行db.collections

// fetch users only when your app renders
useEffect(() => {
    db.collection("customers")
      .doc(user.info.uid)
      .collection("profiles")
      .get()
      .then((querySnapshot) => {
        const documents = querySnapshot.docs.map((doc) => doc.data());
        setUserProfiles(documents);
      });
  }, []);

另有用途效果

useEffect(() => {
    dispatch(profiles(userProfiles));
  }, [userProfiles]);

这也不会起作用。setUserProfiles将导致问题。因为当应用程序呈现时,你提取数据,你设置状态,更改userProfiles,这将再次重新呈现应用程序。
您的代码的问题是您不需要setUserProfiles,而是在db.collections()中,当您获得文档时,您分派文档,然后使用useSelector从redux访问配置文件。

// fetch users only when your app renders
useEffect(() => {
    db.collection("customers")
      .doc(user.info.uid)
      .collection("profiles")
      .get()
      .then((querySnapshot) => {
        const documents = querySnapshot.docs.map((doc) => doc.data());
        // setUserProfiles(documents); You do not need this
        dispatch(profiles(userProfiles))
      });
  }, []);

现在使用useSelector到达redux中的状态

// assuming reducers name is "users"
  const usersState = useSelector((state) => state.users);

现在,当您使用Map Guard应用程序时

// make sure you use the correct data
 // you migh need to destructure
 {usersState && usersState.map((profile) => {
jdg4fx2g

jdg4fx2g2#

对于任何遇到这个问题的人来说,你可能会发现这是很有用的。
第一个

相关问题