为了账号安全,请及时绑定邮箱和手机立即绑定

React JS:将嵌套对象的所有值设置为 false,除了一个

React JS:将嵌套对象的所有值设置为 false,除了一个

梦里花落0921 2023-06-15 17:46:08
我的组件具有以下状态: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   }  })}我怎样才能做到这一点?
查看完整描述

2 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

如果你的浏览器支持 spread syntax,那么更新的对象可以通过该语法和Array#reducemodels获得,如下所述:

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)

}


查看完整回答
反对 回复 2023-06-15
?
慕婉清6462132

TA贡献1804条经验 获得超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

   }

  })

}

如果我们想确保其他属性始终为假,则在设置状态之前覆盖这些值。


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

      })

    }


查看完整回答
反对 回复 2023-06-15
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信