React JS: установите для всех значений вложенного объекта значение false, кроме одного

#javascript #reactjs

#javascript #reactjs

Вопрос:

Мой компонент имеет следующее состояние:

 this.state = {
  models: {
    model1: false,
    model2: true,
    model3: false,
    model4: false
  },

  state1: 'somevalue',
  state2: 5,
  state3: false

}
  

При onButtonClick() вызове функции я хочу, чтобы все значения this.state.models были равны всем false , кроме значения, соответствующего key переменной:

 onButtonClick(e){
  const key = e.target.getAttribute('model');

  this.setState({
   models:{
     //set all states to false except for the key
   }
  })
}
  

Как я могу этого добиться?

Ответ №1:

Если ваш браузер поддерживает расширяемый синтаксис, то обновленный models объект может быть получен с помощью этого синтаксиса и Array#reduce, как описано ниже:

 onButtonClick(e){
  const key = e.target.getAttribute('model');
  
  // Get reference to current models object in state
  const models = this.state.models;

  
  
  // Compose new state object by..
  const state = { 
    models : 
    Object
    .keys(models) // Get list of keys in model
    .reduce((result, k) => { 
      // Reduce keys to object of key/value pairs
      // where key match is set to true
      return { ...result, [k] : key === k };
    }, {})
  }

  this.setState(state)
}
  

Надеюсь, это поможет

Комментарии:

1. Спасибо, это сработало, и спасибо за объяснение <3

Ответ №2:

Вы можете использовать свойства вычисляемого объекта, чтобы заставить его работать. this.setState выполняется неглубокое слияние, и вам придется распространять свойства, вложенные на один уровень глубже.

 onButtonClick(e){
  const key = e.target.getAttribute('model');

  this.setState({
   models:{
     // spread all the properties for models
     ...this.state.models,
     [key]: true // set the key prop to false
   }
  })
}
  

Если мы хотим убедиться, что другие атрибуты всегда false, то переопределите значения перед установкой состояния.

 onButtonClick(e){
      const key = e.target.getAttribute('model');
      const updatedModels = Object.entries(this.state.models)
                                  .reduce((memo, [currKey]) => {
         if(currKey === key) {
             memo[currKey] = true;
         } else {
             memo[currKey] = false;
         }       

  
         return memo;
      }, {});
    
      this.setState({
       models: updatedModels
      })
    }
  

Комментарии:

1. Это не устанавливает для остальных значение false.

2. Это при условии, что одновременно не более чем одному атрибуту будет присвоено значение false .