簡體   English   中英

React JS Firebase:調用 function 刷新數據時的奇怪行為

[英]React JS Firebase :Strange behavior when calling function to refresh data

在我的 React JS 消息應用程序中調用 function 時,我有一些奇怪的行為。 我刪除添加到數據庫中的最后一條消息,然后調用 function 以使用新數據重新查詢 db 和 setState(消息列表減去已刪除的消息)。

但是,它似乎只適用於重新加載頁面或輸入新消息,然后“已刪除”消息將消失並替換為新消息 - 但這應該通過該功能自動發生!

從 db 刪除數據后調用 refresh() - 這似乎是正確的。 此時firebase中的實時db顯示消息已被刪除。

然后在 refresh() function 我有一個控制台日志 - 它肯定被調用,但似乎在 console.log 中被調用了幾次。 此外,在刷新頁面之前,日志中列出的消息仍包含“已刪除”消息。

我已經移動了 setState function (請參閱我嘗試過的兩個位置),現在它確實刪除了消息,但是當我提交新消息時,舊消息和新消息都會顯示!

代碼:

import React, { Component } from 'react';
import firebase from 'firebase';
import { firebaseConfig } from './connection';

// Initialize Firebase
firebase.initializeApp(firebaseConfig);
let messageRef = firebase.database().ref('messages');
let listRef = firebase.database().ref('users');

class LandingPage extends Component {

  constructor(props) {
    super(props);

    this.state = {
      name: '',
      message: '',
      list: [],
      names: [],
      font: "black",
    }

  }

  // LOAD PREVIOUS NAME AND MESSAGES ON PAGE LOAD 
  componentDidMount() {
    const previousMessages = this.state.list;

    messageRef.limitToLast(10).on('child_added', snapshot => {
      previousMessages.push({
        id: snapshot.key,
        message: snapshot.val().text,
        name: snapshot.val().name
      })

      this.setState({
        list: previousMessages
      })
    })
  }

  // PUSH MESSAGE TO DB THEN RESET THIS.STATE
  submitHandler = e => {
    e.preventDefault()
    let name = this.state.name;
    let text = this.state.message;
    function saveMessage(name, text) {
      let newMessageRef = messageRef.push();
      newMessageRef.set({
        name,
        text,
      })
    }
    saveMessage(name, text);

    this.setState({ message: '' });
  }

  // DELETE LAST USER COMMENT 
  onDelete = () => {
    let userName = this.state.name;
    // console.log(userName);
    messageRef.orderByChild('name').equalTo(userName).limitToLast(1).once('child_added', function (snapshot) {
      snapshot.ref.remove();
    })
    this.refresh();

    console.log('call refresh function');
  }
  // REFRESH MESSAGE LIST AFTER DELETING LAST MESSAGE
  refresh = () => {
    const previousMessages = [];
    messageRef.on('child_added', snapshot => {
      previousMessages.push({
        id: snapshot.key,
        message: snapshot.val().text,
        name: snapshot.val().name
      })
      // this.setState({
      //   list: previousMessages
      // })
      console.log(previousMessages);
    })
    this.setState({
      list: previousMessages
    })
  }

  // RENDER THE HTML
  render() {
    return <div className='container'>

      {/* messages will be listed here */}
      < div className='messagesDiv' id='messagesDivId' >
        <ul>
          {/* List array is mapped through*/}
          {this.state.list.map(item => {
            return (
              <li className={(item.name === this.state.name ? 'right' : 'left')}
                style={{ color: this.state.font }}
                key={item.id}
                id={item.id}>
                {item.name}: {item.message}
              </li>
            )
          })}
        </ul>
      </div >

      {/* message text area and send button here  */}
      < div className='inputDiv' id='inputDivId' >
        <form onSubmit={this.submitHandler}>
          <input name="message"
            className='inputBox'
            id='messageInputBox'
            placeholder="Send message..."
            value={this.state.message}
            onChange={this.changeHandler}
            required />
          <button className='submit' type="submit">Send Message</button>
        </form>
      </div >

      {/*think, delete options*/}
      < div id='options' >
        <button id='delete' className='button delete' onClick={this.onDelete}>Delete last message</button>
      </div >

    </div >
  }
}

export default LandingPage;

如果我注釋掉刷新 function,數據庫更新()刪除最后一條消息)並且所有消息都按預期保留在屏幕上。 這讓我認為問題出在 refresh() function 本身,如果有幫助的話。

發現了問題。

它是 componentDidMount() 中的.limitToLast(10) componentDidMount()

這在某種程度上干擾了腳本中的refresh() 我意識到這不是一個值得的解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM