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

Posted

技术标签:

【中文标题】访问数组的索引返回未定义【英文标题】:Accessing index of an array returns undefined 【发布时间】:2020-07-16 13:03:42 【问题描述】:

我正在构建一个简单的 React 应用程序,在其中我从 Firebase 实时数据库收集数据并通过 setState 将其作为数组 (memberArr) 推送到组件状态:

this.setState(members: memberArr)

当我在 render() 方法中记录状态时,我看到了数组的内容。在 React 开发工具中,状态也按预期填充。

如果我现在想访问数组的内容(例如,使用 this.state.members[0]),控制台会返回 undefined。

我这样初始化状态:

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

我的整个 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)

    );
  

附带说明:如果我避免打电话

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

并且仅使用以下方式推送成员的名称和密钥:

memberArr.push([memberName, memberKey])

一切都按预期进行。 console.log(this.state.members[0][0]) 返回由于 setState 触发 render() 方法后的第一个成员的名称。

你有什么建议给我吗?

【问题讨论】:

在渲染时检查数组是否已填充。 this.getExpensesFromUser(memberKey) 是异步的,您在实际接收值之前设置状态,因此您的状态始终为 [] @DragoşPaulMarinescu 但是为什么我在 React 开发工具中看到了正确的状态内容?此外:如果我在 render() 方法中 console.log 状态,它也会向我显示我期望的内容。 而不是pushArray(data)中的.then(data)尝试做this.setState(members: [...this.state.members, data] 我认为初始化还没有完成。我的意见是使用构造函数来初始化状态,然后填充其数据@你的构造函数或你的 componentDidMount 【参考方案1】:

正如 Dragos 所说,您的 getExpensesFromUser 函数会返回异步结果,因此您需要确保仅在这些调用完成后才调用 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)
  );
);

【讨论】:

以上是关于访问数组的索引返回未定义的主要内容,如果未能解决你的问题,请参考以下文章

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

Javascript元素数组innerHTML返回未定义

为什么数组索引未定义为未定义?

Ionic 4 子数组未定义,而索引正确