Ответы:
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 })
setState()
ставит в очередь изменения состояния компонента и сообщает React, что этот компонент и его дочерние элементы должны быть повторно отрисованы с обновленным состоянием. Так что я думаю, что он просто не обновляется в тот момент сразу после его установки. Не могли бы вы опубликовать пример кода, где мы можем увидеть, какую точку вы устанавливаете и регистрируете, пожалуйста?
.concat('new value');
должно быть .concat(['new value']);
concat()
метода. См .: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ( Массивы и / или значения для объединения в новый массив. )
Используя es6, это можно сделать так:
this.setState({ myArray: [...this.state.myArray, 'new value'] }) //simple value
this.setState({ myArray: [...this.state.myArray, ...[1,2,3] ] }) //another array
this.props
и this.state
могут обновляться асинхронно, вы не должны полагаться на их значения при вычислении следующего состояния». В случае изменения массива, поскольку массив уже существует как свойство, this.state
и вам нужно ссылаться на его значение, чтобы установить новое значение, вы должны использовать форму, setState()
которая принимает функцию с предыдущим состоянием в качестве аргумента. Пример: this.setState(prevState => ({ myArray: [...this.state.myArray, 'new value'] }));
См .: reactjs.org/docs/…
Никогда не рекомендуется напрямую изменять состояние.
Рекомендуемый подход в более поздних версиях React - использовать функцию обновления при изменении состояний, чтобы предотвратить состояние гонки:
Вставить строку в конец массива
this.setState(prevState => ({
myArray: [...prevState.myArray, "new value"]
}))
Вставить строку в начало массива
this.setState(prevState => ({
myArray: ["new value", ...prevState.myArray]
}))
Отправить объект в конец массива
this.setState(prevState => ({
myArray: [...prevState.myArray, {"name": "object"}]
}))
Переместить объект в начало массива
this.setState(prevState => ({
myArray: [ {"name": "object"}, ...prevState.myArray]
}))
this.setState((prevState) => ({ myArray: [values, ...prevState.myArray], }));
Вы вообще не должны управлять государством. По крайней мере, не напрямую. Если вы хотите обновить свой массив, вы захотите сделать что-то вроде этого.
var newStateArray = this.state.myArray.slice();
newStateArray.push('new value');
this.setState(myArray: newStateArray);
Работать непосредственно с государственным объектом нежелательно. Вы также можете взглянуть на помощников неизменяемости React.
.slice()
для создания нового массива и сохранения неизменяемости. Спасибо за помощь.
Вы можете использовать .concat
метод для создания копии вашего массива с новыми данными:
this.setState({ myArray: this.state.myArray.concat('new value') })
Но будьте осторожны с особым поведением .concat
метода при передаче массивов - [1, 2].concat(['foo', 3], 'bar')
приведет к [1, 2, 'foo', 3, 'bar']
.
Этот код работает для меня:
fetch('http://localhost:8080')
.then(response => response.json())
.then(json => {
this.setState({mystate: this.state.mystate.push.apply(this.state.mystate, json)})
})
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=[] }
... пожалуйста, я хотел бы знать, что я делаю не так
если вы также хотите, чтобы пользовательский интерфейс ur (например, ur flatList) был в актуальном состоянии, используйте PrevState: в примере ниже, если пользователь нажимает кнопку, он добавит новый объект в список (как в модели, так и в пользовательском интерфейсе). )
data: ['shopping','reading'] // declared in constructor
onPress={() => {this.setState((prevState, props) => {
return {data: [new obj].concat(prevState.data) };
})}}.
Следующим способом мы можем проверить и обновить объекты
this.setState(prevState => ({
Chart: this.state.Chart.length !== 0 ? [...prevState.Chart,data[data.length - 1]] : data
}));
Здесь вы не можете поместить объект в массив состояний, подобный этому. Вы можете продвигаться по-своему в обычном массиве. Здесь вы должны установить состояние,
this.setState({
myArray: [...this.state.myArray, 'new value']
})
Если вы просто пытаетесь обновить состояние вот так
handleClick() {
this.setState(
{myprop: this.state.myprop +1}
})
}
Рассмотрим этот подход
handleClick() {
this.setState(prevState => {
return {
count: prevState.count + 1
}
})
}
По сути, prevState пишет this.state для нас.
console.log(this.state.myArray)
он всегда позади. Есть идеи, почему?