【发布时间】:2017-12-10 03:31:52
【问题描述】:
我无法解决以下问题。
该问题与异步 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 完成之前被调用
我很想在getUserPoints 中使用 setState 回调,但由于我在玩家地图函数中,它将为每个玩家调用它,而我想在用户 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
您的帮助将不胜感激,
谢谢
【问题讨论】:
-
让我理解你的
getUserPoints,有多个用户,每个用户有多个玩家?您能否举例说明用户对象的外观?如果我是正确的,您最终希望setState为您的组件状态与用户及其总点数,您无需进行如此多的状态更新。 -
嗨@NanduKalidindi 你说对了我的最终目标-根据每个用户各自的玩家获得总分 DB中的个人用户对象看起来像
{userName : "playerName1, playerName2, playerName3..."}我将其设为个人状态对于每个看起来像{userName: [playerName1, playerName2, playerName3 etc]}的用户同时我的用户状态对象是一个数组{users:[userName1, userName2 etc]}我目前的想法是获得一个最终状态 userArrayPoints 看起来像{[{userName1: totalUser1Points},{userName2: totalUser2Points}]}