Можно ли вообще обновить свойства объекта setState
?
Что-то вроде:
this.state = {
jasper: { name: 'jasper', age: 28 },
}
Я пытался:
this.setState({jasper.name: 'someOtherName'});
и это:
this.setState({jasper: {name: 'someothername'}})
Первое приводит к синтаксической ошибке, а второе просто ничего не делает. Любые идеи?
age
свойство внутриjasper
.Ответы:
Есть несколько способов сделать это, так как обновление состояния является асинхронной операцией , поэтому для обновления объекта состояния нам нужно использовать функцию обновления с
setState
.1- Самый простой:
Сначала создайте копию, а
jasper
затем внесите изменения в нее:Вместо использования
Object.assign
мы также можем написать это так:2- Использование оператора спреда :
Примечание:
Object.assign
иSpread Operator
создает только поверхностную копию , поэтому, если вы определили вложенный объект или массив объектов, вам нужен другой подход.Обновление вложенного объекта состояния:
Предположим, вы определили состояние как:
Чтобы обновить объект extraCheese of pizza:
Обновление массива объектов:
Предположим, у вас есть приложение todo, и вы управляете данными в этой форме:
Чтобы обновить состояние любого объекта todo, запустите карту в массиве и проверьте наличие уникального значения каждого объекта, в случае
condition=true
возврата нового объекта с обновленным значением, в противном случае - того же объекта.Предложение: если объект не имеет уникального значения, используйте индекс массива.
источник
jasper
объекта, так чтоconsole.log(jasper)
вы увидите только один ключname
, возраст не будет там :)jasper
естьobject
, лучше или нет, возможно, возможны и другие лучшие решения :)Object.assign
операторы глубокого копирования, ни распространяемые операторы не распространяются. Таким образом, вы должны использовать обходные пути, такие как lodashdeepCopy
и т. Д.let { jasper } = this.state
?Это самый быстрый и самый читаемый способ:
Даже если
this.state.jasper
уже есть свойство name,name: 'someothername'
будет использоваться новое имя .источник
this.state.jasper
, не обязательно содержать последнее состояние. Лучше использовать обозначения сprevState
.Используйте оператор распространения и немного ES6 здесь
источник
Я использовал это решение.
Если у вас есть вложенное состояние, подобное этому:
Вы можете объявить функцию handleChange, которая копирует текущее состояние и переназначает его с измененными значениями.
здесь HTML с прослушивателем событий. Убедитесь, что вы используете то же имя, что и для объекта состояния (в данном случае «friendName»)
источник
statusCopy.formInputs[inputName] = inputValue;
Я знаю, что здесь есть много ответов, но я удивлен, что ни один из них не создает копию нового объекта вне setState, а затем просто setState ({newObject}). Чисто, лаконично и надежно. Итак, в этом случае:
Или для динамического свойства (очень полезно для форм)
источник
попробуйте это, должно работать нормально
источник
Object.assign({}, this.state.jasper, {name:'someOtherName'})
Первый случай действительно является синтаксической ошибкой.
Поскольку я не вижу остальной части вашего компонента, трудно понять, почему вы вкладываете объекты в своем состоянии здесь. Не стоит вкладывать объекты в состояние компонента. Попробуйте установить начальное состояние так:
Таким образом, если вы хотите обновить имя, вы можете просто позвонить:
Достигнет ли это того, к чему вы стремитесь?
Для больших и более сложных хранилищ данных я бы использовал что-то вроде Redux. Но это намного сложнее.
Общее правило с состоянием компонента - использовать его только для управления состоянием пользовательского интерфейса компонента (например, активный, таймеры и т. Д.).
Проверьте эти ссылки:
источник
Другой вариант: определить вашу переменную из объекта Jasper, а затем просто вызвать переменную.
Оператор спреда: ES6
источник
Простой и динамичный способ.
Это сделает работу, но вам нужно установить все идентификаторы для родителя, чтобы родитель указывал на имя объекта, то есть id = "jasper", и называл имя свойства input element = свойство внутри объекта jasper. ,
источник
Вы можете попробовать это : ( Примечание : имя входного тега === поле объекта)
источник
это еще одно решение, использующее утилиту immer immutabe, очень легко подходящее для глубоко вложенных объектов, и вам не следует беспокоиться о мутации
источник
Также, следуя решению Альберто Пираса, если вы не хотите копировать весь объект «состояние»:
источник
Вы можете попробовать это:
или для другого имущества:
Или вы можете использовать функцию handleChage:
и HTML-код:
источник
Без использования Async и Await Используйте это ...
Если вы используете с Async и Await, используйте это ...
источник
Эта настройка работала для меня:
источник