#javascript #reactjs #state
#javascript #reactjs #состояние
Вопрос:
Я пытаюсь обновить свое состояние, чтобы вложенный массив был очищен, но остальная часть состояния осталась прежней.
Мой объект состояния выглядит так:
this.state = {
data: {
type: "FeatureCollection",
features: [1,2,3,4]
}
}
И я ближе всего к работе:
this.setState(prevState => ({
data: [...prevState.data, (this.state.data.features.length = 0)]
}));
Предупреждение консоли, которое я получаю при таком подходе:
Do not mutate state directly. Use setState() react/no-direct-mutation-state
Но как еще это возможно?
Большое спасибо 🙂
Комментарии:
1. что вы пытаетесь обновить? Вы делаете массив пустым?
2. @WillJenkins Откуда ты знаешь, что этого нет в конструкторе? Я думаю, что это внутренняя часть
setState
.3. @BrianThompson — он говорит вам «Использовать setState ()», что вы и делаете
4. Но есть также прямое назначение
this.state.xx
, которое, скорее всего, является проблемой.5. @UKS Да, я просто хочу сделать массив пустым
Ответ №1:
Первая проблема, которую я вижу в вашем коде, заключается в том, что вы переходите data
от объекта к массиву. Так что это должно быть как минимум
this.setState(prevState => ({
data: {...prevState.data, (this.state.data.features.length = 0)}
}));
Тогда вы все еще изменяете состояние, делая this.state.data.features.length = 0
это, поэтому, чтобы исправить это, вам нужно постоянно обновлять этот массив:
this.setState(prevState => ({
data: {
...prevState.data,
features: [] // Or whatever you need your new array to be
}
}));
Итак, скажем, вы хотели добавить еще один элемент в конец, вы могли бы сделать:
this.setState(prevState => ({
data: {
...prevState.data,
features: [...prevState.data.features, 5]
}
}));
Ответ №2:
Вы должны обновить состояние следующим образом. data
в состоянии находится объект, а не массив.
this.setState(prevState => ({
data: {...prevState.data, features: [] }
}));