Firebase和Expo:数据库添加子项并立即将其删除

时间:2018-05-24 00:30:56

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

我正在使用Expo和Firebase创建一个会议应用程序(如f8应用程序)。

组件“TalkInfo”有一个函数addOrRemoveUserTalk(loggedUser, talk),当你触摸某些Talk的Like / Dislike按钮时触发,而状态“buttonText”可能是“Like”或“Dislike”文本中的按钮:

  • 如果this.state.buttonText == 'Dislike'单击按钮,应用程序将从db
  • 中删除“userTalk”
  • 如果this.state.buttonText == 'Like'该应用为用户创建“userTalk”。

我有一个问题:我可以在db中添加userTalk,我可以删除它,但是如果我再次添加相同的userTalk,firebase添加它,并立即删除它

请掌握firebase的人可以帮助我吗?

addOrRemoveUserTalk(loggedUser, talk) {
  var text = 'Like';

  if(this.state.buttonText == 'Dislike') {
    firebaseApp.database().ref().child('userTalks')
      .orderByChild('user')
      .equalTo(loggedUser.uid)
      .on('child_added', (snap) => {
        userTalk = snap.val();
        if(userTalk.talk == talk.id) {
          text = 'Like';
          console.log("CHILD WILL BE DESTROYED");
          snap.ref.remove();
        }
      })
  } else {
    text = 'Dislike';
    console.log("CHILD WILL BE ADDED");
    firebaseApp.database().ref().child('userTalks').push({
      user: loggedUser.uid,
      talk: talk.id,
    }).key;
  }

  console.log("text in addOrRemoveUserTalk_________", text);

  text == 'Like' ?
    this.setState({ buttonText: 'Like' }) :
    this.setState({ buttonText: 'Dislike' })
}

1 个答案:

答案 0 :(得分:0)

现在每当你第一次"喜欢"一个帖子,你添加了一个永远保持"活性。你想要的只是读取一次值,然后停止监视它。作为数字评论,您希望使用once()代替on()

if(this.state.buttonText == 'Dislike') {
  firebaseApp.database().ref().child('userTalks')
    .orderByChild('user')
    .equalTo(loggedUser.uid)
    .once('child_added', (snap) => {
      userTalk = snap.val();
      if(userTalk.talk == talk.id) {
        text = 'Like';
        console.log("CHILD WILL BE DESTROYED");
        snap.ref.remove();
      }
    })
} else {
  text = 'Dislike';
  console.log("CHILD WILL BE ADDED");
  firebaseApp.database().ref().child('userTalks').push({
    user: loggedUser.uid,
    talk: talk.id,
  }).key;
}