我有这个数组映射函数来渲染一些东西...... 我有5个从0开始的变量,根据switch语句,每个变量值都增加1。
renderUser = (index)=>{
let C1Count = 0, C2Count = 0, C3Count = 0, C4Count = 0, C5Count = 0;
let users = this.state.users.map((user,index)=>{
// swiching some value , that is from 0 to 4
switch(this.state.users[index].result){
case 0: { C1Count += 1; break; }
case 1: { C2Count += 1; break; }
case 2: { C3Count += 1; break; }
case 3: { C4Count += 1; break; }
case 4: { C5Count += 1; break; }
default: { console.log("non"); break; };
}
return(
....stuff to render
)
}).reverse();
return users;
}
我想更新5个州
this.setState({
C1Count:C1Count, // state : variable value
C2Count:C2Count, // state : variable value
C3Count:C3Count, // state : variable value
C4Count:C4Count, // state : variable value
C5Count:C5Count // state : variable value
});
如果我将setState代码放在...}).reverse();
之后和..return users;
我得到了
超出最大更新深度。组件时可能会发生这种情况 反复调用componentWillUpdate中的setState或 componentDidUpdate。 React限制嵌套更新的数量 防止无限循环。
错误....所以我的问题是......如何在完成所有循环并更新C1Count, C2Count, C3Count, C4Count, C5Count
变量后更新状态。
答案 0 :(得分:3)
当你setState()
时,你将导致另一个渲染,因此你的无限循环。您不应该从setState
致电render
。其中一个lifecycle方法(componentDidMount等)根据您的需要会更好,如果这是组件的初始状态,则constructor
。
答案 1 :(得分:0)
默认情况下,React组件在其状态通过setState()
更改时将重新呈现,这就是render()
应该是纯函数的原因(即,不修改状态)。
对于您的情况,Count
变量是派生状态,因此您不需要实际保留该值。相反,您可以创建一个计算其值的函数:
getCounts() {
return this.state.users.reduce((counts, user) => {
switch (user.result) {
case 0:
counts.C1Count++; break;
case 1:
counts.C2Count++; break;
case 2:
counts.C3Count++; break;
case 3:
counts.C4Count++; break;
case 4:
counts.C5Count++; break;
default:
console.log("non");
}
return counts;
}, { C1Count: 0, C2Count: 0, C3Count: 0, C4Count: 0, C5Count: 0 });
}