为什么this.setState在这里不起作用?

时间:2018-07-23 13:47:05

标签: javascript reactjs react-native

snapshot.forEach(function(childSnapshot) {
  groupRef.child(childSnapshot.key).once("value", (snap) => {
    this.setState.bind({
      expenses: this.state.expenses.concat(snap.val()),
    });
  })
})

我得到的错误是

undefined is not an object (evaluating '_this2.setState')

状态已通过以下方式声明

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

1 个答案:

答案 0 :(得分:5)

这是因为您没有正确调用或使用绑定,并且引用的this在通过使用传统函数回调调用forEach创建的上下文中是不同的。要绑定的第一个参数是上下文而不是参数。

在这种情况下,只需避免使用箭头功能,这样this仍然是您的组件参考。

snapshot.forEach((childSnapshot) => {
  groupRef.child(childSnapshot.key).once("value", snap =>
    this.setState(state => ({ expenses: [ ...state.expenses, snap.val()] }))
  );
});

请注意,在引用现有状态时,应使用上述setState的回调样式,因为setState在设置状态时是异步的,尤其是在异步回调中设置循环时,状态可能已更改。