我正在尝试从Firebase获取有关系统生命周期中问题状态的实时更改。我的child_changed
事件的互动方式与我预期的不同,因此我不确定自己是否使用正确。
我想获取对questionStatus
变量的新更改,以便如果系统上的另一个用户更改了数据库上的变量,则两个用户都可以实时看到更新。我的Firebase数据库的设置如下:
-/questions
-/ID1234567890
-/title
-/messages
-/ID1234567890
-/ID2345678901
“ child_changed”通话:
fire.database().ref('/questions/' + this.state.questionId + '/questionStatus').on('child_changed', snap => {
this.setState({
questionStatus: (snap.val().questionStatus),
})
console.log("CHANGED!")
})
上面的代码是我认为应该如何工作的方式,但是我永远无法使console.log像预期的那样显示。通过仅从questionStatus
中删除ref()
(如下面的代码中概述),每当我向问题添加新消息(用于聊天)时,该事件就会触发,并且似乎导致加载错误。我误解了firebase还是我的代码更深入?也许这与组件的生命周期有关?我尝试将其放置在任何地方都无济于事,但目前在componentWillMount()
中使用了它。让我知道您的想法,谢谢!
fire.database().ref('/questions/' + this.state.questionId).on('child_changed', snap => {
this.setState({
questionStatus: (snap.val().questionStatus),
})
console.log("CHANGED!")
})
答案 0 :(得分:0)
根据我的研究,我不完全了解setState()
,不知道状态只能异步更新,而不能同步。知道了这一点,我刚刚实现了一项功能,通知用户状态已更改并单击按钮以重新加载。这并不理想,但现在可以使用。
我还测试了排除具有特定键(messages
)的孩子。
所以我的新代码如下:
fire.database().ref('/questions/' + this.state.questionId).on('child_changed', snap => {
// Ignore if messages are being added to the ticket
if(snap.key !== 'messages'){
this.setState({
questionStatus: (snap.val().questionStatus),
questionTags: (snap.val().questionTags),
question
})
}
})