Отправка массива возвращает длину
this.state.myArray.push('new value')
возвращает длину расширенного массива вместо самого массива. Array.prototype.push () .
Я думаю, вы ожидаете, что возвращаемое значение будет массивом.
Неизменность
Похоже, это скорее поведение React:
НИКОГДА не изменяйте this.state напрямую, так как последующий вызов setState () может заменить произведенную вами мутацию. Относитесь к this.state как к неизменяемому. React.Component .
Думаю, вы бы сделали это так (не знаком с React):
var joined = this.state.myArray.concat('new value');
this.setState({ myArray: joined })
console.log(this.state.myArray)
он всегда позади. Есть идеи, почему?setState()
ставит в очередь изменения состояния компонента и сообщает React, что этот компонент и его дочерние элементы должны быть повторно отрисованы с обновленным состоянием. Так что я думаю, что он просто не обновляется в тот момент сразу после его установки. Не могли бы вы опубликовать пример кода, где мы можем увидеть, какую точку вы устанавливаете и регистрируете, пожалуйста?.concat('new value');
должно быть.concat(['new value']);
concat()
метода. См .: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ( Массивы и / или значения для объединения в новый массив. )Используя es6, это можно сделать так:
Синтаксис распространения
источник
this.props
иthis.state
могут обновляться асинхронно, вы не должны полагаться на их значения при вычислении следующего состояния». В случае изменения массива, поскольку массив уже существует как свойство,this.state
и вам нужно ссылаться на его значение, чтобы установить новое значение, вы должны использовать форму,setState()
которая принимает функцию с предыдущим состоянием в качестве аргумента. Пример:this.setState(prevState => ({ myArray: [...this.state.myArray, 'new value'] }));
См .: reactjs.org/docs/…Рекомендуемый подход в более поздних версиях React - использовать функцию обновления при изменении состояний, чтобы предотвратить состояние гонки:
Вставить строку в конец массива
Вставить строку в начало массива
Отправить объект в конец массива
Переместить объект в начало массива
источник
this.setState((prevState) => ({ myArray: [values, ...prevState.myArray], }));
Вы вообще не должны управлять государством. По крайней мере, не напрямую. Если вы хотите обновить свой массив, вы захотите сделать что-то вроде этого.
Работать непосредственно с государственным объектом нежелательно. Вы также можете взглянуть на помощников неизменяемости React.
https://facebook.github.io/react/docs/update.html
источник
.slice()
для создания нового массива и сохранения неизменяемости. Спасибо за помощь.Вы можете использовать
.concat
метод для создания копии вашего массива с новыми данными:Но будьте осторожны с особым поведением
.concat
метода при передаче массивов -[1, 2].concat(['foo', 3], 'bar')
приведет к[1, 2, 'foo', 3, 'bar']
.источник
Этот код работает для меня:
источник
fetch(`api.openweathermap.org/data/2.5/forecast?q=${this.searchBox.value + KEY} `) .then( response => response.json() ) .then( data => { this.setState({ reports: this.state.reports.push.apply(this.state.reports, data.list)}); });
this.state = { reports=[] }
... пожалуйста, я хотел бы знать, что я делаю не такРеагировать-Native
если вы также хотите, чтобы пользовательский интерфейс ur (например, ur flatList) был в актуальном состоянии, используйте PrevState: в примере ниже, если пользователь нажимает кнопку, он добавит новый объект в список (как в модели, так и в пользовательском интерфейсе). )
источник
Следующим способом мы можем проверить и обновить объекты
источник
Здесь вы не можете поместить объект в массив состояний, подобный этому. Вы можете продвигаться по-своему в обычном массиве. Здесь вы должны установить состояние,
источник
Если вы просто пытаетесь обновить состояние вот так
Рассмотрим этот подход
По сути, prevState пишет this.state для нас.
источник