我试图只更新数组状态中的一个元素,但我不知道该怎么做。
国家
constructor(props) {
super(props);
this.state = {
markers: [],
};
}
设置状态
setCurrentLocation() {
var root = this;
root.setState({
markers: [
...root.state.markers,
{
coordinate: {
latitude: parseFloat(root.state.currentLat),
longitude: parseFloat(root.state.currentLon)
},
key: root.state.currentLat,
image: pinCurrentLocation
},
],
});
}
如果我想更改标记的第四个元素中的键,我该怎么做?
由于
答案 0 :(得分:32)
重要的是,我们不应该直接改变状态数组,总是在新数组中进行更改,然后使用setState更新状态值。
根据 Doc :
的建议永远不要直接改变this.state,将this.state视为好像 不可变的。
更新状态数组的基本流程是:
1 - 首先创建状态数组的副本。
2 - 查找项目的索引(如果索引可用,请跳过此项目。)
3 - 更新该索引处的item值。
4 - 使用setState更新状态值。
可能有多种解决方案:
1 - 使用array.map并检查要更新的元素,当您发现该元素返回具有更新键值的新对象时,否则只返回相同的对象。像这样:
let newMarkers = markers.map(el => (
el.name==='name'? {...el, key: value}: el
))
this.setState({ markers });
2 - 我们还可以使用array.findIndex查找该特定项目的索引,然后更新该项目的值。像这样:
let markers = [...this.state.markers];
let index = markers.findIndex(el => el.name === 'name');
markers[index] = {...markers[index], key: value};
this.setState({ markers });
如果我们知道项目的索引,则不需要循环,直接我们可以写:
let markers = [ ...this.state.markers ];
markers[index] = {...markers[index], key: value};
this.setState({ markers });
答案 1 :(得分:1)
使用创建功能
尝试此操作onEditComparatorClicked(i) {
let editableComparatorIndexes = [...this.state.markers];
editableComparatorIndexes[i] = 1;
this.setState({editableComparatorIndexes});
}
答案 2 :(得分:0)
我试图以数组状态推送值并像这样设置值,并通过map函数定义状态数组并推送值。
this.state = {
createJob: [],
totalAmount:Number=0
}
your_API_JSON_Array.map((_) => {
this.setState({totalAmount:this.state.totalAmount += _.your_API_JSON.price})
this.state.createJob.push({ id: _._id, price: _.your_API_JSON.price })
return this.setState({createJob: this.state.createJob})
})
答案 3 :(得分:0)
状态
this.state = {
barcodeArray:['']
};
更新数组
var barcode_text='hi';
this.setState({ barcodeArray:[...this.state.barcodeArray,barcode_text] })}