首页 > 解决方案 > setState 不使用 firebase 对象更新数组

问题描述

所以我遇到的问题是该setState方法似乎不想更新我的数组状态questions。但是当我使用console.log(returnArr)控制台时,我会从 firebase 打印我想要的项目。

我做错了什么?

export default class App extends React.Component {
  constructor() {
    super();
    this.state = {
      questions: [],
      current_question: 0
    };
  }

  componentDidMount() {
    var rootRef = firebase.database().ref();
    var ref = rootRef.child("Geography");
    var returnArr = [];

    ref
      .once("value")
      .then(function(snapshot) {
        snapshot.forEach(function(childSnapshot) {
          var item = childSnapshot.val();
          item.key = childSnapshot.key;

          if (item.key === "2") {
            returnArr.push(item.Question);
            setState = () => ({
              questions: returnArr
            });
            console.log(returnArr);
          }
        });
      })
      .catch(error => {
        console.log(error);
      });
  }

  render() {
    // ...
  }
}

标签: reactjsreact-native

解决方案


setState是您应该调用的函数,而不是您应该为其分配新值的对象。

如果要this在 firebase 回调函数中使用,则必须使用bind该函数this或使用箭头函数。您很可能希望在处理完整个快照后将阵列设置为状态。

例子

class App extends React.Component {
  // ...

  componentDidMount() {
    firebase
      .database()
      .ref()
      .child("Geography")
      .once("value")
      .then(snapshot => {
        const questions = [];

        snapshot.forEach(childSnapshot => {
          const item = childSnapshot.val();
          item.key = childSnapshot.key;

          if (item.key === "2") {
            questions.push(item.Question);
          }
        });

        this.setState({ questions });
      })
      .catch(error => {
        console.error(error);
      });
  }

  // ...
}

推荐阅读