state
, возвращаемое [state, setState] = useState([])
- это то, что вы должны только читать . Если вы измените его, React не будет знать, что данные изменились и что они должны быть повторно обработаны. Когда вам нужно изменить данные, вы должны использовать setState
, или в вашем случае setSelectedCharacters
.
Кроме того, изменение данных по ссылке может привести к непредсказуемым результатам, если массив будет считан в другом месте, позже .
В дополнение к этому, если вы дадите setState
то же значение, которое хук вернул вам в state
, React полностью пропустит обновление. Это не проблема при использовании чисел или строк, но становится единым при использовании массивов, потому что ссылка (значение, которое React использует, чтобы определить, есть ли разница) может быть одинаковой, когда содержимое могло измениться. Таким образом, вы должны передать новый массив setState
.
С учетом этого ваша функция onChange
может выглядеть следующим образом:
onChange={e => {
const index = selectedCharacters.indexOf(
e.target.value
);
if (index === -1) {
// creating a new array with [], so the original one stays intact
setSelectedCharacters([...selectedCharacters, e.target.value]);
} else {
// Array.filter also creates new array
setSelectedCharacters(selectedCharacters.filter((char, i) => i !== index));
}
}}
Do c здесь https://en.reactjs.org/docs/hooks-reference.html#usestate