我无法解决下面的问题。
该问题与异步 setState 维度有关。通常我使用回调,但在这里似乎不合适。
我的目标是创建一个状态(我将能够对其进行排序),该状态是通过迭代不同的状态而获得的,这些状态本身是在地图中创建的。
下面的函数调用我的不同方法,我们感兴趣的是最后两个。getUserPoints
和sortArrayforUserRank
。
getPlayersByUser = () => {
database
.ref(`pools/${this.state.selectedValue}`)
.once("value")
.then(data => {
for (let item in data.val()) {
this.setState({
users: this.state.users.concat([item])
});
this.setState({ [item]: data.val()[item] });
}
})
.then(this.makePlayersArray)
.then(this.getUserPoints)
.then(this.sortArrayforUserRank);
getUserPoints = () => {
this.state.users.map(user => {
// Create the dynamic name of the state, 1 for each user
let userPoints = `${user}points`;
// initializing the state for userPoint to be at 0 for future calculation
this.setState({ [userPoints]: 0 });
this.state[user].map(player => {
database
.ref(`players/${player}`)
.child("points")
.once("value")
.then(data => {
let points = parseInt(data.val());
this.setState(state => ({
[userPoints]: points + state[userPoints]
}));
});
});
});
在getUserPoints
允许我动态创建state.userPoints总结从球员每个用户的所有点。
然后我期待sortArrayforUserRank
下面使用更新的 state.userPoints 来创建我的最终 userArrayPoints 状态。
sortArrayforUserRank = () => {
this.state.users.map(user => {
let userPoints = `${user}points`;
this.setState(state => ({
userArrayPoints: state.userArrayPoints.concat([
{ [user]: state[userPoints] }
])
}));
});
目前, userArrayPoints 填充了 4 个对象,{[user]:0}
而不是每个用户的最终点数总和。问题是sortArrayforUserRank
在前一个 setState 完成之前被调用
我很想在其中使用 setState 回调,getUserPoints
但是由于我在玩家地图函数中,它将为每个玩家调用它,而我想在用户 lvl 处理它以获得最终的点数总和。
我尝试使用componentDidUpdate
, 并按照那些文章使 sur 使用 functionnal setState ,但无法弄清楚。
https://medium.com/@shopsifter/using-a-function-in-setstate-instead-of-an-object-1f5cfd6e55d1
https://medium.freecodecamp.org/functional-setstate-is-the-future-of-react-374f30401b6b
您的帮助将不胜感激,
谢谢