简体   繁体   English

访问数组的索引返回未定义

[英]Accessing index of an array returns undefined

i am building a simple React app where i collect data from a Firebase realtime database and push it as an array (memberArr) into the component state via setState:我正在构建一个简单的 React 应用程序,在其中我从 Firebase 实时数据库中收集数据,并将其作为数组 (memberArr) 通过 setState 推送到组件 state 中:

this.setState({members: memberArr})

When I log the state in the render() method, I see the contents of the array.当我在 render() 方法中记录 state 时,我看到了数组的内容。 In the React Dev Tools the state is also filled as expected.在 React 开发工具中,state 也按预期填充。

If I now want to access the contents of the array (eg with this.state.members[0]) the console returns undefined.如果我现在想访问数组的内容(例如,使用 this.state.members[0]),控制台返回未定义。

I initialize the state like this:我像这样初始化 state:

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

My whole componentDidMount() method looks like this:我的整个 componentDidMount() 方法如下所示:

componentDidMount() {

    const membersRef = firebase.database().ref(`${groupName}/members`);

    membersRef.on('value', (data) => {

      const memberArr = []; 

      data.forEach(function(snapshot){

        //Gets name of member
        var memberName = snapshot.val().name;

        //Gets UID of member
        var memberKey = snapshot.key;

        //Get expenses from fetched member. When ready call function to push everything as array into component state.
        this.getExpensesFromUser(memberKey).then(function(data) {
          pushArray(data)
        });

        function pushArray(memberExpense) {
          memberArr.push([memberName, memberKey, memberExpense])
        };

        //This works:
        //memberArr.push([memberName, memberKey])

      }.bind(this));

      this.setState({members: memberArr})

    });
  }

On a side note: If I avoid calling附带说明:如果我避免打电话

this.getExpensesFromUser(memberKey).then(function(data) {
          pushArray(data)
        });

and only use the following to push the name and key of the members:并且仅使用以下内容来推送成员的名称和密钥:

memberArr.push([memberName, memberKey])

everything works as expected.一切都按预期工作。 console.log(this.state.members[0][0]) returns the name of the first member after the render() method gets triggered due to setState. console.log(this.state.members[0][0]) 返回由于 setState 触发 render() 方法后的第一个成员的名称。

Do you have any tips for me?你对我有什么建议吗?

As Dragos commented, your getExpensesFromUser function returns asynchronous results, so you need to make sure to only call setState once those calls have finished.正如 Dragos 评论的那样,您的getExpensesFromUser function 返回异步结果,因此您需要确保仅在这些调用完成后才调用setState

const membersRef = firebase.database().ref(`${groupName}/members`);
membersRef.on('value', (data) => {
  const promises = [];
  data.forEach((snapshot) => {
    var memberKey = snapshot.key;
    promises.push(this.getExpensesFromUser(memberKey))
  });

  Promise.all(promises).then((data) => {
    const memberArr = data.map((item) => [memberName, memberKey, memberExpense]);
    this.setState({members: memberArr})
  });
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM