我有以下声明:
constructor(props) {
super(props);
this.state = {
productArray: [{
barcode: '',
name: ''
}],
numberOfRecords: '',
return_code: '',
return_string: ''
};
}
我希望像这样引用状态字段:
this.state.productArray [0] .barcode和this.state.productArray [1]
我也有一段代码尝试更新状态。代码如下:
for (counter=0;counter<numberOfRecords;counter++) {
currentComponent.setState({productArray[counter].barcode: tempData.barcode[counter]});
currentComponent.setState({productArray[counter].name: tempData.name[counter]});
}
这无法编译,并且错误指向第一个setState命令。编译器指向[在对productArray [counter] .barcode的引用中说它期望一个','。
我可以正确定义状态吗?如果没有,正确的语法是什么?如果是,引用个别状态字段的正确语法是什么?
答案 0 :(得分:1)
理想情况下,您只需要对ExecutorService
进行一次调用,就可以创建一个临时变量来存储计算,例如
setState
通过使用传播运算符const { productArray, numberOfRecords } = this.state;
const newProducts = [ ... productArray ];
for( let counter = 0; counter < numberOfRecords; counter ) {
const item = newProducts[ counter];
newProducts[ counter] = { ...item, barcode: 'value' },
}
this.setState({ productArray: newProducts });
,您可以创建shallow copies对象和数组。
答案 1 :(得分:0)
您不能直接将状态设置为
let tempvar = this.state.productArray;
for (counter=0;counter<numberOfRecords;counter++) {
tempvar[counter].barcode= newValue
}
this.setState({productArray:tempvar})
答案 2 :(得分:0)
更新对象嵌套数组的推荐方法是利用Object.assign
的功能。请记住,Object.assign将不会执行深度克隆,因为它仅复制属性值,
this.setState({
productArray: Object.assign({}, this.state.productArray[0], {
barcode: 'any value',
})}, ()=>{
console.log(this.state)
}
);
在您的情况下,这就是使用速记符号实现此目的的方法:
for (var counter = 0; counter < 1; counter++) {
this.setState({
productArray: Object.assign({}, this.state.productArray[counter], {
barcode: tempData.barcode[counter],
name: tempData.name[counter]
})}, ()=>{
console.log(this.state)
}
);
}
答案 3 :(得分:0)
关于数据,我正在挑选tempData数组的特定部分
和
我可以从状态中删除numberOfRecords并从tempData.length中获取它。
好,所以productArray
包含tempData
中对象的属性子集,而不是项目的子集。
然后,我什至不必费心尝试复制值并简单地map新值。
currentComponent.setState({
productArray: tempData.map(item => {
const {barcode, name} = item;
return {barcode, name};
})
});
//or in short
currentComponent.setState({
productArray: tempData.map(({barcode, name}) => ({barcode, name}))
});
回答您的问题;如果要访问和更新某些嵌套属性,则应在setState()
中使用update-function,以便在您的代码尝试对其进行修改之前,所有先前的更新都已应用于this.state
。
类似这样的东西:
currentComponent.setState((state) => {
for(let i = 0; i<tempData.length; ++i){
let from = tempData[i], to = state.productArray[i];
to.name = from.name;
to.barcode = from.barcode;
}
return state;
});
此方法的缺点/不足之处在于,无法解决tempData.length !== state.productArray.length
的情况。