React Js- 无法将对象“#<Object> 的只读属性分配给只读属性

React Js- Cannot assign to read only property of object '#<Object>'

提问人:Coding Ninja123211 提问时间:10/27/2023 最后编辑:Coding Ninja123211 更新时间:10/27/2023 访问量:50

问:

在我的应用程序中,我有一个 ,它从 firebase 获取所有数据,并将数据调度给状态。useEffect

以下是 useEffect 中用于获取所有聊天数据的代码:

let chatsData={}
let chatsFoundCount = 0

chatIds.forEach(chatId => {
            const chatRef = child(dbRef, `chats/${chatId}`)
            chatsFoundCount++

            onValue(chatRef, (chatSnapshot) => {
                    const data = chatSnapshot.val()
                    data.key = chatSnapshot.key

   
                     chatsData[chatId] = data
                

                     if (chatsFoundCount >= chatIds.length) {
                                    dispatch(setChatsData({chatsData}))
                     } 

                   }
                }
            })

这将按预期工作,并在加载所有聊天时调度数据,并在更新该位置的数据时调度数据,再次运行其中的代码,并修改并重新调度对象。chatRefonValuechatsData

我还加载了消息数据,但是在尝试修改对象时,出现错误:messagesData Cannot assign to read only property '-NhgsfvmDOrruQXdC0S8' of object '#<Object>'

这是用于检索消息、侦听位置更改和重新调度的代码:

            const messagesRef = child(dbRef, `messages/${chatId}`)
            refs.push(messagesRef)

            let messageData = {}

            onValue(messagesRef, (messageSnapshot) => {

              messageSnapshot.forEach((childSnapshot) => {
                let data = childSnapshot.val()

                if (data.hiddenFrom) {
                  let currentHiddenFrom = data.hiddenFrom.filter((uid) => uid === userData.userId)
                  console.log(currentHiddenFrom);

                  if (currentHiddenFrom.length === 0) {
                    messageData[childSnapshot.key] = childSnapshot.val()
                  }
                } else {
                  messageData[childSnapshot.key] = data
                }
              dispatch(setMessagesData({chatId, messageData}))

注意:上面的代码也在 chatIds.forEach 块中。尝试更新中的对象时会出现问题,但是我对对象执行了上述相同的技术,并且一切都按预期工作。为什么对象不能像对象一样更新?谢谢。messageData onValuechatsData messageDatachatsData

更新:当我在 中添加这段代码时,一切都按预期工作,因此调度不是问题,而是变量的位置。为什么会这样?let messageData = {}onValue

JavaScript ReactJS Firebase

评论

0赞 Sam Spade 10/27/2023
如果您能提供更完整的代码片段,那将会有所帮助。此外,尝试创建一个最小的可重现示例通常很有帮助。因此,复制您正在处理的任何内容并删除代码片段和代码块,直到它尽可能短,同时仍然导致问题。现在发生了很多事情,我们看不到事情是如何初始化的,所以很难说其中的哪一部分可能是问题所在。
0赞 Coding Ninja123211 10/27/2023
@SamSpade 请看我的更新,你会看到代码在foreachh循环中。这可能是问题所在吗?另请注意,onValue 是用于从数据库中检索数据的侦听器,在更新数据时也会调用
0赞 Sam Spade 10/27/2023
所以,你说你的错误发生在你“修改 messagesData 对象”时,我假设这是一行,但由于我不知道该函数是做什么的或它是如何设置的,所以很难说会发生什么。在您的代码中有许多类似的示例,我无法判断您做事是否正确,因为我看不到这些变量中的任何一个是如何初始化的。请发布更多上下文,或者剔除不相关的代码并发布 MREdispatch(setMessagesData({chatId, messageData}))setMessagesData
0赞 Coding Ninja123211 10/27/2023
@SamSpade您好,请检查更新,我已经找到了解决方案,但是我不确定为什么会这样。也许是因为?forEach loop
0赞 Sam Spade 10/27/2023
因此,如果 messageData 是在 onValue 中初始化的,则 onValue 始终以空白开头。如果在 onValue 外部初始化它,则多次调用它将导致每次调用时都会对 messageData 对象进行更改。只有这些代码片段,我不可能说这是否是故意的。

答: 暂无答案