Я хочу добавить элемент в конец state
массива, это правильный способ сделать это?
this.state.arrayvar.push(newelement);
this.setState({arrayvar:this.state.arrayvar});
Я обеспокоен тем, что изменение массива на месте push
может вызвать проблемы - это безопасно?
Альтернатива сделать копию массива и сделать setState
это кажется расточительной.
javascript
reactjs
fadedbee
источник
источник
Ответы:
Документы React говорят:
Вы
push
будете напрямую изменять состояние, что потенциально может привести к появлению кода, подверженного ошибкам, даже если впоследствии вы снова «сбрасываете» состояние. F.ex, это может привести к тому, что некоторые методы жизненного цикла, напримерcomponentDidUpdate
, не сработают.Рекомендуемый подход в более поздних версиях React заключается в использовании функции обновления при изменении состояний для предотвращения состояний гонки:
Потеря памяти не является проблемой по сравнению с ошибками, с которыми вы можете столкнуться при нестандартных модификациях состояния.
Альтернативный синтаксис для более ранних версий React
Вы можете использовать,
concat
чтобы получить чистый синтаксис, так как он возвращает новый массив:В ES6 вы можете использовать Spread Operator :
источник
push
возвращает новую длину массива, чтобы она не работала. Кроме того,setState
isync и React могут ставить в очередь несколько изменений состояния в один проход рендеринга.setState
дважды, он показывает два похожих примера установки массива состояний без непосредственного изменения его.let list = Array.from(this.state.list); list.push('woo'); this.setState({list});
измените его в соответствии со своими предпочтениями стиля.Проще всего, если вы используете
ES6
.Новый массив будет
[1,2,3,4]
обновить свое состояние в React
Узнайте больше о деструктуризации массива
источник
Самый простой способ с
ES6
:источник
tableData = [['test','test']]
После толкнул мой новый массивtableData = [['test','test'],['new','new']]
. как протолкнуть это @David и @Ridd[['test','test'],['new','new']]
попробовать:this.setState({ tableData: [...this.state.tableData, ['new', 'new']]
this.setState({ tableData: [...this.state.tableData ,[item.student_name,item.homework_status_name,item.comments===null?'-':item.comments] ] });
Он вставляет новый массив два раза.this.state.tableData.push([item.student_name,item.homework_status_name,item.comments===null?'-':item.comments]);
Достигает желаемой цели. но это не правильный путь, я думаю.React может пакетно обновлять, и поэтому правильный подход - предоставить setState функцию, которая выполняет обновление.
Для аддона обновления React надежно будет работать следующее:
или для concat ():
Ниже показано, что https://jsbin.com/mofekakuqi/7/edit?js,output как пример того, что происходит, если вы ошиблись.
Вызов setTimeout () правильно добавляет три элемента, поскольку React не будет пакетно обновлять в обратном вызове setTimeout (см. Https://groups.google.com/d/msg/reactjs/G6pljvpTGX0/0ihYw2zK9dEJ ).
Багги на клике добавят только «третий», а исправленный добавит F, S и T, как и ожидалось.
источник
this.setState( update(this.state, {array: {$push: ["First", "Second", "Third"]}}) )
state.array = state.array.concat([4])
это мутирует предыдущий объект состояния.Как упомянуто в комментарии @nilgun, вы можете использовать помощники реагирования на неизменяемость . Я нашел это, чтобы быть супер полезным.
Из документов:
Простое нажатие
initialArray по-прежнему [1, 2, 3].
источник
Если вы используете функциональный компонент, используйте его, как показано ниже.
источник
За добавленный новый элемент в массив,
push()
должен быть ответ.Для удаления элемента и обновления состояния массива приведенный ниже код работает для меня.
splice(index, 1)
не может работать.источник
Я пытаюсь выдвинуть значение в состояние массива и установить значение, как это и определить массив состояния и толкать значение с помощью функции карты.
источник
Это сработало для меня, чтобы добавить массив в массиве
источник
Вот пример Reactjs Hook 2020 года, который, как я думал, может помочь другим. Я использую его для добавления новых строк в таблицу Reactjs. Дайте мне знать, могу ли я что-то улучшить.
Добавление нового элемента в компонент функционального состояния:
Определим данные состояния:
Есть кнопка, чтобы вызвать функцию, чтобы добавить новый элемент
источник
источник
stackoverflow
.setState(state => ({arrayvar: [...state.arrayvar, ...newelement]}) );
newelement
объекта в массиве бросает вTypeError
любом случае.источник
Этот код работает для меня:
источник
.push
возвращает число , а не массив.