Ваш код создает новый объект и устанавливает newItem
как свойство для него (имя свойства newItem
, вы непреднамеренно используете сокращенную запись свойства), а затем отправляете этот новый элемент в массив.
Минимальное изменение - изменить это:
newDomesticArray.push({
newItem
});
к этому:
newDomesticArray.push(newItem);
Но
Вам необходимо использовать версию обратного вызова setState
, а не версию, которой вы передаете объект. Это потому, что вы устанавливаете новое состояние на основе существующего состояния и [обновления состояния асинхронны и могут быть объединены] [1].
Мы можем сделать это более кратким. : -)
Итак, просто обратимся к этим двум вещам и используем деструктуризацию параметров:
addDomesticItem() {
this.setState(({domesticArray}) => {
const newItem = {
id: Date.now(),
index: domesticArray.length,
quantity: 0,
watt: 0,
duration: 0,
whDay: 0,
};
return {domesticArray: [...domesticArray, newItem]};
});
}
Но (часть 2):
Я рекомендую вам не полагаться на Date.now
для id
. Если вы когда-нибудь добавите два элемента в течение одной миллисекунды (помните, что компьютеры быстрые ), у них не будет уникальных идентификаторов.
Я рекомендую не включать индекс элемента в массиве в сам элемент, поскольку это затрудняет ведение записей в массиве.
Вместо этого в вашем компоненте будет постоянно увеличивающийся счетчик, который вы используете для значений id
. В вашем конструкторе:
this.idAllocator = 0;
и затем:
addDomesticItem() {
this.setState(({domesticArray}) => {
const newItem = {
id: ++this.idAllocator,
quantity: 0,
watt: 0,
duration: 0,
whDay: 0,
};
return {domesticArray: [...domesticArray, newItem]};
});
}
и затем:
let listDomestic = this.state.domesticArray.map((item, index) =>
<DomesticItem
key={item.id}
deleteMethod={() => this.deleteDomesticElement(key)}
/>
);
и затем, когда вам нужно найти элемент в this.state.domesticArray
, вы используете find
:
const item = this.state.domesticArray.find(item => item.id === id);
или findIndex
, чтобы найти его индекс:
const index = this.state.domesticArray.findIndex(item => item.id === id);
и помните, что если вы собираетесь использовать index
для изменения domesticArray
, вам нужно сделать это в setState
обратном вызове.