spread operator(...)正在es6中的数组中创建额外的字段

Owa*_*ais 5 javascript ecmascript-6 reactjs react-redux

我想根据一个事件key/value在各自中嵌入一对新indexed array of objectsonChange.

但是,它已正确完成但在数组中添加了额外的元素.

原始对象数组:

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)

May*_*kla 5

写这样:

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 .