【发布时间】:2019-08-22 18:32:21
【问题描述】:
我有一个对象数组。我想更新函数内数组中每个对象的一个属性。
我在render之外声明了一个函数:
const computePiePercentages = function(pieChartData, remainingBudget){
var denominator = 1600;
if(remainingBudget > 0){
denominator = 1600 - remainingBudget
}
return pieChartData.map((val, j) => {
val.y = Number((val.y / denominator).toFixed(1)) * 100
});
};
我对反应还是很陌生-我知道pieChartData.map((val, j) 允许我循环遍历数组中的对象。我想return pieChartData.map((val, j) 我会返回更新后的数组。然而,情况似乎并非如此。我目前正在为 scale.js 获取Cannot read property 'x' of undefined(我什至不知道这个文件)
我在这里调用函数:
render() {
const { data, remainingBudget, pieChartData, outOfBudget, answeredQuestions } = this.state;
const questions = data.questions;
return (
<div>
{answeredQuestions == 1 &&
<div>
<VictoryPie
colorScale = "blue"
data = {computePiePercentages(pieChartData, remainingBudget)}
//data = {this.state.pieChartData}
labels= {d => `${d.x}: ${d.y}%`}
style={{ parent: { maxWidth: '50%' } }}
/>
{outOfBudget.length > 0 &&
<div>
<Table>
<th>Out of Budget</th>
< BrokeBudget
outOfBudget={outOfBudget}
/>
</Table>
</div>
}
</div>
}
</div>
);
}
}
【问题讨论】:
-
小心,所有答案(到目前为止)都会直接改变状态对象,这在 React 中是被禁止的。
-
什么是安全的解决方案?
-
基于Updating an Item in an Array,映射时应该返回一个新对象:
pieChartData.map((val, j) => ({ ...val, y: /* computation here */ })) -
但是
y是val的一个属性——{ ...val, y: /* computation here */ }的语法不是暗示y是数组中的另一个元素吗? -
...val将val的属性传播到我们的新对象中,然后我们用计算覆盖新对象中的y属性:Number((val.y / denominator).toFixed(1)) * 100
标签: javascript arrays reactjs