Відповіді:
this.state.myArray.push('new value')
повертає довжину розширеного масиву замість самого масиву. Array.prototype.push () .
Я думаю, ви очікуєте, що повернене значення буде масивом.
Здається, це скоріше поведінка React:
НІКОЛИ не мутуйте this.state безпосередньо, оскільки виклик setState () згодом може замінити зроблену вами мутацію. Ставтеся до цієї держави, ніби вона непорушна. Реакт.компонент .
Я думаю, ви зробили б це так (не знайоме з 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=[] }
... pls, я хотів би знати, що я роблю неправильно
якщо ви також хочете, щоб інтерфейс ур (наприклад, 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']
})
console.log(this.state.myArray)
це роблю, це завжди один позаду. Будь-яка ідея чому?