Нажатие на массив состояний React

Как я могу написать это лучше, я хочу сделать это с помощью setState вместо this.state.floors.push, поскольку я знаю, что это плохая практика, но я не мог этого понять. Я использую React Native.

FloorAPI.getFloorsByBuildingID(this.state.buildingID).then((response) => response.d.data.map((value) => {
  console.info(value.floorName)
  this.state.floors.push({value: value.floorName})
}))

Возможный дубликат Правильный способ вставки в массив состояний

Aliaksandr Sushkevich 06.09.2018 17:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
39 575
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Вы можете использовать

this.setState({floors: [{value: value.floorName}]}); 

чтобы использовать установленное состояние.

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

user3637804 06.09.2018 16:56
Ответ принят как подходящий
// Create a new array based on current state:
let floors = [...this.state.floors];

// Add item to it
floors.push({ value: floorName });

// Set state
this.setState({ floors });

Просто и отлично работает, спасибо. Хотя что с тремя периодами, зачем это нужно?

user3637804 06.09.2018 17:04

Мне было немного странно оборачиваться, но ... является частью концепции под названием «деструктуризация»: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

imjared 06.09.2018 17:38

лучшее осмысленное кодирование.

Aboobakkar P S 13.03.2020 05:20

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

var tempArray = []

FloorAPI.getFloorsByBuildingID(this.state.buildingID).then((response) => response.d.data.map((value) => {
  tempArray.push({value: value.floorName})
}))

this.setState({floors: tempArray})
FloorAPI.getFloorsByBuildingID(this.state.buildingID).then((response) => { 
  // get current floors
  const { floors } = this.state;

  // get new floors after api request
  const newfloors = response.d.data.map((value) => ({value: value.floorName}))

  // set the new state by combining both arrays
  this.setState({ floors: [...floors, ...newfloors] });
})

Вы всегда можете использовать предыдущее состояние.

setState((prevState)=>({
   floors: prevState.floors.push({...})
});

Это хороший способ избежать прямого изменения состояния. Другой способ - сделать следующее:

var newState=[...this.state.floors];
newState.push({...});

setState(()=>({
  floors: newState
)}

Это своего рода мешанина из двух решений. В вашем первом решении вы не должны изменять prevState.floors, что и делает push, а во втором решении вам не нужно передавать обратный вызов setState, если вы создаете объект, который не использует аргумент state обратного вызова.

meagar 06.09.2018 17:45

Спасибо! Не сейчас, когда мне не разрешили изменять prevState. Теперь, когда вы указали на это, я вижу причину этого.

Dan Mehlqvist 06.09.2018 20:38

На данный момент самый лучший и простой способ - это

  this.setState(previousState => ({
      floors: [...previousState.floors, {"value": value.floorName}]
  }));

я получил ошибку TypeError: недопустимая попытка распространения не повторяемого экземпляра

Ray Coder 10.09.2019 17:27

@RayCoder Причина, по которой вы получаете TypeError : Invalid attempt to spread non-iterable instance, потому что данные, которые вы используете для разрушения, не являются массивом, и причина, по которой они не могут быть повторены, и причина, по которой вы получили ошибку.

amitsin6h 20.01.2020 18:31
const { floors } = this.state;

// Add item to it
floors.push({ value: 5 });

// Set state
this.setState({ floors });

В форме крючков вы можете использовать

setState((prevVals) => [...prevVals,newVals])

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