Обновление объекта с помощью setState в React
возможно ли вообще обновить свойства объекта с помощью setState?
что-то типа:
this.state = {
   jasper: { name: 'jasper', age: 28 },
}
Я пробовал:
this.setState({jasper.name : 'someOtherName'});
и так:
this.setState({jasper:{name:'someothername'}})
первая-это синтаксическая ошибка, а второй просто ничего не делает. Есть идеи?
7 ответов
есть несколько способов сделать это.
1 - Простое:
создать копию jasper затем сделайте изменения в этом:
let jasper = Object.assign({}, this.state.jasper);    //creating copy of object
jasper.name = 'someothername';                        //updating value
this.setState({jasper});
вместо Object.assign мы также можем написать так:
let jasper = {...this.state.jasper};
2 - с помощью распространение оператор:
this.setState(prevState => ({
    jasper: {
        ...prevState.jasper,
        name: 'something'
    }
}))
самый быстрый и наиболее читаемый способ:
this.setState({...this.state.jasper, name: 'someothername'});
хотя this.state.jasper уже содержит свойство name, latter name: 'someothername' С быть использован.
первый случай действительно является синтаксической ошибкой.
поскольку я не вижу остальную часть вашего компонента, трудно понять, почему вы размещаете объекты в своем состоянии здесь. Не рекомендуется размещать объекты в состоянии компонента. Попробуйте установить начальное состояние:
this.state = {
  name: 'jasper',
  age: 28
}
таким образом, если вы хотите изменить имя, вы можете просто звоните:
this.setState({
  name: 'Sean'
});
достигнет ли это того, к чему вы стремитесь?
для больших, более сложных хранилищ данных я бы использовал что-то вроде "возвращение". Но это гораздо более продвинутый.
общее правило с состоянием компонента-использовать его только для управления состоянием пользовательского интерфейса компонента(например, active, timers и т. д.)
проверьте эти ссылки:
я использовал это решение.
Если у вас есть вложенный такой:
   this.state = {
          formInputs:{
            friendName:{
              value:'',
              isValid:false,
              errorMsg:''
            },
            friendEmail:{
              value:'',
              isValid:false,
              errorMsg:''
            }
}
вы можете объявить функцию handleChange, которая копирует текущий статус и повторно назначает его с измененными значениями
handleChange(el) {
    let inputName = el.target.name;
    let inputValue = el.target.value;
    let statusCopy = Object.assign({}, this.state);
    statusCopy.formInputs[inputName].value = inputValue;
    this.setState(statusCopy);
  }
здесь html с прослушивателем событий. Обязательно используйте то же имя, что и в state object (в данном случае 'friendName')
<input type="text" onChange={this.handleChange} " name="friendName" />
Используйте оператор распространения и некоторые ES6 здесь
this.setState({
    jasper: {
          ...this.state.jasper,
          name: 'something'
    }
})
кроме того, следуя решению Альберто Пираса, если вы не хотите копировать весь объект "состояние":
handleChange(el) {
    let inputName = el.target.name;
    let inputValue = el.target.value;
    let jasperCopy = Object.assign({}, this.state.jasper);
    jasperCopy[inputName].name = inputValue;
    this.setState({jasper: jasperCopy});
  }
другой вариант: определите свою переменную из яшма object, а затем просто вызовите переменную.
оператор распространения: ES6
this.state = {  jasper: { name: 'jasper', age: 28 } } 
let foo = "something that needs to be saved into state" 
this.setState(prevState => ({
    jasper: {
        ...jasper.entity,
        foo
    }
})