开发者问题收集

从 Firebase 获取的数据无法通过 React JS 显示?

2018-07-01
2154

我让下面的 react js 代码运行,没有任何错误,但不确定为什么它没有在 <li> 元素中显示来自数据库的任何内容。

当我在 ComponentWillMount 中控制台记录它时,它会正确提取数据。

App.js

    class FirebaseDB extends React.Component {
      constructor(props) {
        super(props);
        this.state = { messages: [] };
      }
      componentWillMount(){
        let messagesRef = firebase.database().ref('messages');
        messagesRef.on('child_added', snapshot => {
          let message = { text: snapshot.val(), id: snapshot.key };
          console.log(message);
        })
      }

      render() {
        return (
          <div>
            <ul>
              { /* Render the list of messages */
                this.state.messages.map( message => <li key={message.id}>{message.text}</li> )
              }
            </ul>
          </div>
        );
      }
    }


class App extends Component {
  render() {
    return (
      <FirebaseDB />
    );
  }
}
2个回答

您从未将状态设置为包含消息,因此它永远不会呈现。您可以尝试

constructor(props) {
  super(props);
  this.state = { messages: [] };
}

componentWillMount(){
  let messagesRef = firebase.database().ref('messages');
  messagesRef.on('child_added', snapshot => {
    let message = { text: snapshot.val(), id: snapshot.key };
    this.setState({
      messages: [...this.state.messages, message],
    });
  })
}
imjared
2018-07-01

在 React 中,如果您希望在屏幕上显示某些内容,则需要将其置于 state 上。现在您的 state 上确实有一个 messages 数组,但您从 Firebase 检索的数据并未添加到 state ,因此没有呈现任何内容。

我并不熟悉 Firebase 本身,但我想基本思路应该是这样的。

componentWillMount(){
        let messagesRef = firebase.database().ref('messages');
        messagesRef.on('child_added', snapshot => {
          let message = { text: snapshot.val(), id: snapshot.key };
          const messages = [...this.state.messages]; // copy state so not to mutate
          messages.push(message);
          this.setState({messages}); // this will tell react to re-render with the newly added data
          console.log(message);
        })
      }
Chaim Friedman
2018-07-01