当您的组件首次安装时,它会调用ComponentDidMount并初始化 peopleArray 。这只执行一次,因此每次从Firebase接收更新时,此阵列都会发生变异。使用当前的实现,您将状态变为引用 peopleArray 被保持在状态作为指针,而不是价值。 React在检查状态树中是否有变化时,不会进行深度比较,它会进行对象比较。这就是为什么你永远不想改变你的状态,总是在设置状态时创建新对象。这也适用于redux。
peopleArray
一个超级快速的解决方案是移动线 let peopleArray = [] 进入firebase onValue处理程序,以便每次获得更新时都会创建一个新数组。此外,使用当前实现,您将继续将Firebase值附加到同一个数组上,因此您可能会获得重复项。我提到的修复也将照顾到这一点。
let peopleArray = []
这是你的最终CDM:
componentDidMount() { this.dbroot = firebase.database().ref().child('io') this.dbroot.on('value', snapshot => { let peopleArray = [] snapshot.forEach((snap) => { if(snap.val().active === true) { peopleArray.push(snap.val()) } }) this.setState({people: peopleArray}) }); }