代码之家  ›  专栏  ›  技术社区  ›  StackUnderFlow

从firebase获取的数据不使用react js显示?

  •  0
  • StackUnderFlow  · 技术社区  · 6 年前

    我运行了下面的react js cod,没有错误,但不确定为什么它没有在 <li> 元素。

    当我控制台将其登录到组件willmount时,它会正确地提取数据。

    应用程序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 回复  |  直到 6 年前
        1
  •  2
  •   imjared    6 年前

    您永远不会将状态设置为包含消息,这样它就永远不会呈现。你可以试试

    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],
        });
      })
    }
    
        2
  •  1
  •   Chaim Friedman    6 年前

    在react中,如果你想在屏幕上显示一些东西,你需要把 state 是的。现在你有了 messages 在您的 状态 ,但从firebase检索的数据不会添加到 状态 ,因此不会渲染任何内容。

    我对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);
            })
          }