状态已更新但反应未显示反映在UI上

问题描述:

我有一个复选框列表,我可以在用户选中或取消选中时更新其对象数组。但是我有一个问题,即使我更新状态,其他值也不会改变。状态已更新但反应未显示反映在UI上

http://jsbin.com/qomekohile/1/edit?js,console,output

class HelloWorldComponent extends React.Component { 

    constructor(){ 
    super() 
    this.handleChange = this.handleChange.bind(this); 
    this.state = { 
     "fruits":[ 
     {"name":"banana","value":true}, 
     {"name":"watermelon","value":false}, 
     {"name":"lemon","value":true}, 
     {"name":"other","value":true,"other_value":"Durian"} 
     ] 
    } 
    } 

    handleChange(e,key){ 
    let nxState = Object.assign({}, this.state) 
    nxState.fruits.find(obj => { 



     if (obj.name === key) { 
     obj.value = e.target.checked 

     if(obj.name === 'other' && obj.value === false){ 
      obj.other_value = ''; //why this won't work 
     } 

     return true 
     } else { 
     return false 
     } 
    }); 
    this.setState(nxState) 
    } 

    render() { 
    return (
     <div> 
     {this.state.fruits.map(obj => 
      (obj.name === 'other') ? 

      <div> 
      <label>{obj.name}</label> 
      <input onChange={(e) => this.handleChange(e, obj.name)} type="checkbox" defaultChecked={obj.value} /> 
      <input type="text" defaultValue={obj.other_value} /> 
      </div> 
      : 
      <div key={obj.name}> 
      <label>{obj.name}</label> 
      <input onChange={(e) => this.handleChange(e, obj.name)} type="checkbox" defaultChecked={obj.value} /> 
      </div> 
     )} 
     <br /> 
     <pre>{JSON.stringify(this.state.fruits,null,2)}</pre> 
     </div> 
    ); 
    } 
} 

您应该设置value和定义一些changeHandler,使这个输入控制(defaultValue attr为唯一不受控制的领域):

<input type="text" value={obj.other_value} onChange={(e) => this.handleOtherChange(e)}/> 

//example `other` text input change handler 
handleOtherChange(e){ 
    let nxState = {...this.state, fruits: [ 
     ...this.state.fruits, 
    ]}; 
    nxState.fruits.find(obj => obj.name === 'other').other_value = e.target.value; 
    this.setState(nxState) 
} 

也请注意,只有Object.assign执行浅合并对象,并且由于直接改变状态对象应该被避免,所以你必须执行深度拷贝(复制嵌套对象和数组),这可以通过usi ng的语法如上例所示,但通常我会推荐使用immutability-helperImmutable来执行状态更新的不可变方式。

+0

我得到了这个警告'警告:...包含一个输入值和默认值的道具的文本类型 – Mellisa

+0

我的不好。答案已更新。 –

+0

啊这更优雅,太棒了! (虽然我不知道为什么这个问题实际存在),所以问题是由Object.assign引起的? – Mellisa