Обновление одного значения в массиве состояний реагирует родной

Пытаясь обновить один элемент массива в this.state, я получаю (ожидаемую) ошибку, но не вижу, где я ошибся. Нужно ли мне создать временное обновление массива, а затем вернуть весь массив в состояние

Это по сути то, что у меня есть

this.state = { array: ['a', 'b', 'c'] };

onBack() {
  this.setState({
      array[2]: 'something' 
  });
}
Do I need to create a temporary array update that, then assign the whole array back to the state да
bamtheboozle 30.05.2018 13:24

@ DragoşPaulMarinescu прав, и этот подход - лучший подход!

Rajendran Nadar 30.05.2018 13:43
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
4
2
15 377
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Используйте Object.assign ({});

let array= Object.assign({}, this.state.array); //creating copy of object

array[2] = "something"

this.setState({array});

Ответ Маноджа будет работать, есть другой способ использовать функцию обновления (конечный setState) для setState (о которой вы можете прочитать о здесь)

onBack() {
  this.setState(prevState => {
    let newArray = prevState.array
    newArray[2] = "something"
    return { array: newArray }
  });
}
Ответ принят как подходящий

Вы не можете так обновить состояние.

Never mutate this.state directly, as calling setState() afterwards may replace the mutation you made. Treat this.state as if it were immutable.

Прочтите React docs.

Вы можете сделать что-то вроде этого:

let newArray = [...this.state.array];
newArray[2] = 'somethingElse';
this.setState({array: newArray});

В приведенном выше примере используется Распространение синтаксиса.

Есть несколько способов изменить состояние, но все они должны гарантировать, что данные обрабатываются как неизменяемые. Вы можете узнать больше об обработке состояния в React здесь

проголосовали за подход оператора распространения, а также просто за дополнительные знания, что будет лучше для производительности: прямая мутация состояния или использование оператора распространения?

GD- Ganesh Deshmukh 05.05.2020 12:50

непосредственное изменение будет быстрее, так как вам не нужно создавать копию, но это приведет к несогласованному состоянию, и этого никогда не следует делать. Оператор распространения в основном создает копию исходного массива.

illiteratewriter 05.05.2020 13:13

Создайте временное обновление массива, которое затем верните весь массив в состояние

var arr = [];
arr = this.state.array;
arr[2] = "something";
this.setState({
    array : arr
});

Это неправильно, так как это напрямую изменяет состояние. arr = this.state.array НЕ ведет себя так, как вы ожидаете.

bamtheboozle 31.05.2018 15:03

Я попытался использовать свой собственный демонстрационный проект, и он отлично работает, как того хочет OP.

Kirankumar Dafda 01.06.2018 08:39

Потому что это в корне неверно и не должно быть общепринятым ответом. arr = this.state.array не создает новый массив, а создает ссылку на state.array. Попробуйте записать в консоль this.state.array после того, как сделаете arr[2] = "something", и посмотрите, что произойдет.

bamtheboozle 02.06.2018 20:00

Вы явно не понимаете неизменность и то, что я пытаюсь объяснить, поэтому я просто остановлюсь.

bamtheboozle 04.06.2018 20:56

Извините за это, и спасибо за очистку концепции неизменяемого состояния, я погуглил и попытался понять то же самое.

Kirankumar Dafda 05.06.2018 11:50

Когда вы делаете arr[2], вы напрямую изменяете то, что находится в состоянии. Это не лучшая идея. Кроме того, поскольку вы напрямую изменяете состояние, нет смысла использовать setState, поскольку состояние уже было изменено на предыдущем шаге.

kojow7 21.09.2018 06:30

Если вы беспокоитесь о том, чтобы установить новый обновленный массив на вашем currentArray с помощью функции распространения, вы можете использовать Array.from(duplicateArray)

let duplicateArray = [...currentArray] //duplicate the array into new array
duplicateArray[index].value = 'x'; // update the field you want to update
setCurrentArray(Array.from(duplicateArray )) //set the new updated array into currentArray

Меня беспокоит эта проблема, я просто ищу, и я увидел эту идею, и она работает! https://github.com/facebook/react-native/issues/21734#issuecomment-433885436

Другие вопросы по теме