【问题标题】:Maximum update depth exceeded. This can happen when a component calls setState inside useEffect,超过最大更新深度。当组件在 useEffect 中调用 setState 时,可能会发生这种情况,
【发布时间】:2021-04-29 19:27:46
【问题描述】:
 useEffect(() => { 
      const onChildAdd = database().ref('/User/' + user.uid ).on('value', snapshot => {
    setComplete(snapshot.val().Complete);
    setUserProfile(snapshot.val().User);  
    setStartYear(snapshot.val().StartYear);
     setDisplayName(snapshot.val().displayName);
    setDisplayPicture(snapshot.val().photoURL);
    // ...
    });
    
    
    return () =>
   database().ref('/User/' + user.uid  )
        .off('value', onChildAdd);


    }, [user.uid])

这就是他们每个人的使用方式

<Text>My name is {displayName}</Text>

错误 警告:已超过最大更新深度。当组件在 useEffect 中调用 setState 时,可能会发生这种情况,但 useEffect 要么没有依赖数组,要么每次渲染时依赖项之一发生变化。

【问题讨论】:

  • setUserProfile(snapshot.val().User); 是否更新 user?你只有一个依赖 user.id 我假设它是一个字符串。似乎每次调用数据库你都会得到一个不同的user.uid,这就是你得到那个错误的原因
  • 正如@buzatto 指出的那样,您已经导致了一个无限循环,每次添加useEffect 处理程序时,都会更新用户配置文件,这会重置您的useEffect 处理程序并再次更新配置文件.您应该将[user.uid] 换成[activeUserId][currentUserId],并确保不要在useEffect 处理程序中设置它。然后当你想同步另一个用户的数据时,只需更改activeUserId/currentUserId,它就会正确获取新数据。
  • 那么意思是userUser 是同一个东西?
  • user.uid 来自被调用到该文档的认证文档,而User 只是从文档中读取
  • 当我删除 SetUserProfile(snapshot.val().User 时,错误仍然存​​在

标签: javascript reactjs firebase react-native firebase-realtime-database


【解决方案1】:

您是否在此 sn-p 上方的代码中使用默认值?

如果你这样做

const myComponent (props)=>{
    const {user = {}, stuff } = props; 

    {/* code here that accesses 'user' object inside hooks */}

    return <h1>Hi></h1>

}

可能会在每次渲染时为“用户”变量创建一个新对象! 要么使用 defaultprops,要么将空对象创建移出渲染循环

const empty = {};

const myComponent (props)=>{
    const {user = empty, stuff } = props; 

    {/* code here that accesses 'user' object inside hooks */}

    return <h1>Hi></h1>

}

【讨论】:

    猜你喜欢
    • 2020-12-11
    • 2019-08-12
    • 1970-01-01
    • 2021-05-13
    • 2019-07-25
    • 2020-10-22
    • 2018-09-13
    • 2023-04-09
    • 2021-01-29
    相关资源
    最近更新 更多