Owa*_*ais 5 javascript ecmascript-6 reactjs react-redux
我想根据一个事件key/value在各自中嵌入一对新indexed array of objects的onChange.
但是,它已正确完成但在数组中添加了额外的元素.
原始对象数组:
0:{data: {…}}
1:{data: {…}}
2:{data: {…}}
3:{data: {…}}
4:{data: {…}}
Run Code Online (Sandbox Code Playgroud)
达到的结果:
0:{data: {…}}
1:{data: {…}}
2:{data: {…}, origin: "UK"}
3:{data: {…}, origin: "UK"}
4:{data: {…}}
5:"UK"
6:"UK"
Run Code Online (Sandbox Code Playgroud)
预期结果:
0:{data: {…}}
1:{data: {…}}
2:{data: {…}, origin: "UK"}
3:{data: {…}, origin: "UK"}
4:{data: {…}}
Run Code Online (Sandbox Code Playgroud)
下面是我在循环中执行的代码:
render: (rowData, indexes) => {
return (
<SelectField
id={`origin-${indexes.rowIndex}`}
defaultValue="US"
style={{ position: 'absolute' }}
onChange={text => {
this.setState(
{
generalPermitSelectedVehicles: [
...generalPermitSelectedVehicles,
(generalPermitSelectedVehicles[
indexes.rowIndex
].origin = text),
],
},
() => {
console.log({
generalPermitSelectedVehicles: this.state
.generalPermitSelectedVehicles,
});
},
);
}}
menuItems={[
{
label: 'America',
value: 'US',
},
{
label: 'United Kingdom',
value: 'UK',
},
{
label: 'Oman',
value: 'Oman',
},
]}
/>
);
},
Run Code Online (Sandbox Code Playgroud)
写这样:
this.setState(prevState => {
let data = [...prevState.generalPermitSelectedVehicles];
data[indexes.rowIndex].origin = text;
return {generalPermitSelectedVehicles: data};
})
Run Code Online (Sandbox Code Playgroud)
为什么它在你的情况下失败?
因为当你这样做时:
[...arr, (arr[index].origin=10)]
Run Code Online (Sandbox Code Playgroud)
它将做两件事,首先它将更新该索引处的origin值,其次它将()在数组末尾添加10(从10返回).
检查此代码段:
let arr = [{a:1}, {a:2}, {a:3}];
arr = [...arr, (arr[1].a=500)]; //500 will get added in the last
console.log('new value', arr);Run Code Online (Sandbox Code Playgroud)
建议:使用更新程序功能(prevState),因为下一个状态(值)generalPermitSelectedVehicles取决于先前的值.
有关setState更新程序功能的更多详细信息,请查看DOC .
| 归档时间: |
|
| 查看次数: |
601 次 |
| 最近记录: |