Дополнительно
Обновление объекта с setState в реагируешь
Это вообще возможно, чтобы обновить объект's свойства при выполнении функция setState?
Что-то вроде:
this.state = {
jasper: { name: 'jasper', age: 28 },
}
Я пробовал:
this.setState({jasper.name: 'someOtherName'});
и это:
this.setState({jasper: {name: 'someothername'}})
Первые результаты в синтаксическую ошибку, а второй просто ничего не делает. Любые идеи?
211
14
Существует несколько способов сделать это, поскольку государство обновление асинхронной операции, поэтому для обновления состояния объекта, мы должны использовать функция обновления с
выполнении функция setState
.1 - Простое:
Сначала создайте копию
яшма
, затем сделать изменения в том, что:Вместо того, чтобы использовать объект.назначить мы также можем записать это так:
2 - с помощью [распространения оператора]3:
Примечание: `Объект.назначить " и " распространение оператор создает только копию, поэтому, если вы определили вложенный объект или массив объектов, вам нужен другой подход.
Обновление # вложенного состояния объекта:
Предположим, вы определили состояние как:
Для обновления extraCheese пиццы объект:
Обновление массива объектов:
Допустим, у вас есть todo приложение, и вы управляете данные в таком виде:
Чтобы обновить состояние любого объекта, задач, запустить карту на массив и проверять по некоторым уникальным значением каждого элемента, в случае, если условие=true, то возвращает новый объект с обновленным значением, еще и тот же объект.
Примечание: Если объект не'т иметь уникальное значение, а затем использовать индекс массива.
Это самый быстрый и самый четкий способ:
Даже если это есть.государства.Джаспер уже содержит свойство, новое имя `имя: 'someothername' С быть использован.
Использование оператора распространения и некоторых ЕС6 здесь
Я использовал это решение.
Если у вас есть вложенные государством такой:
это.состояние = { formInputs:{ friendName:{ значение:'', функция IsValid:ложные, errorMsg:'' }, friendEmail:{ значение:'', функция IsValid:ложные, errorMsg:'' } } }
вы можете объявить функцию handleChange, что копия текущего состояния и повторно назначает его с измененными значениямиздесь HTML с помощью прослушивателя событий. Убедитесь в том, чтобы использовать то же имя используется в состоянии объекта (в данном случае 'friendName')
попробуйте этот,он должен работать нормально
В первом случае это действительно ошибка синтаксиса.
Поскольку я могу'т см. Остальные компонента, это's жесткий, чтобы увидеть, почему вы'вэ объекты, гнездящихся в вашем положении здесь. Это's не хорошая идея, чтобы объекты гнездо в компоненте государства. Попробуйте установить исходное состояние, чтобы быть:
Таким образом, если вы хотите изменить имя, вы можете просто позвонить:
Это добиться того, что вы'вновь целился?
Для больших, более сложных хранилищ данных, я хотел бы использовать что-то вроде "возвращение". Но, что'ы гораздо более продвинутые.
Общее правило с составляющую государственную, чтобы использовать его только для управления состоянием пользовательского интерфейса компонента (например, активный, таймеры и др.).
Проверьте эти ссылки:
Другой вариант: определить переменную из яшма объект и потом просто назвать переменную.
Распространение оператор: ЕС6
Я знаю, что есть много ответов здесь, но я'м удивлены, что никто из них создать экземпляр нового объекта за пределами выполнении функция setState, а потом просто выполнении функция setState({переменная newobject}). Чистый, лаконичный и надежный. Так в этом случае:
в
в
Или для динамического свойства (очень полезно для форм)
в
в
константный Джаспер = { ...этого.государства.Джаспер, [VarRepresentingPropertyName]: 'новое значение' } это.выполнении функция setState(prevState => ({ яшма }))
в
Вы можете попробовать с этим:
или на другое имущество:
Или вы можете использовать функцию handleChage:
а HTML код:
Вы можете попробовать с этим: (Примечание: имя тега input === поле объекта) `` <входное имя="в поля myfield, что" типа=на"текст" и значение={этот.государства.мой_объект.поля myfield} onChange, после={этот.handleChangeInpForm}> </вход>
handleChangeInpForm = (е) => { пусть переменная newobject = это.государства.объект MyObject; переменная newobject[электронный.цель.имя] = Эл.цель.значение; это.выполнении функция setState({ мой_объект: переменная newobject }) } ``
Простой и динамичный способ.
Это будет делать эту работу, но вам нужно установить все эти идентификаторы родителя, родитель будет указать имя объекта, свой паспорт = то "Яшма" и имя элемента input = собственность внутри объекта Джаспер.
Без использования async и await используйте это...
Если вы с помощью async и await используйте это...
Кроме того, после Альберто Пирас решение, если вы не'т хотите скопировать всех "государства" по объекту:
это еще одно решение с использованием Иммер утилиты immutabe, очень подходит для глубоко вложенные объекты с легкостью, и вы не должны заботиться о мутации