locked
- это массив логических значений. Этот код использует синтаксис распространения для создания нового массива логических значений из текущего, но с одним инвертированным элементом idx
. Подробная разбивка:
this.setState(st => ({ // callback version of setState that receives the current state as the argument
locked: [ // set a new array for `locked` that consists of :
...st.locked.slice(0, idx), // every element before the element at idx
!st.locked[idx], // the element at idx but inverted
...st.locked.slice(idx + 1) // every element after idx
]
Вы также можете создать копию исходного массива и инвертировать элемент в idx
после этого:
this.setState(st => {
const locked = Array.from(st.locked);
locked[idx] = !locked[idx];
return {locked};
});
Или вы можете сопоставить массив:
this.setState(st => ({
locked: st.locked.map((item, i) => i === idx ? !item : item)
}));
Все это решает проблему инвертирования элемента в idx
при создании нового массива (состояние реакции не должно изменяться).