2017-03-08 59 views
0

尝试检查复选框,您将看到未定义。这很奇怪,我认为我正确使用了find。或者有更好的方法来做到这一点?反应绑定到复选框并更新状态基于选中

http://jsbin.com/ficijuwexa/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}, 
     ] 
    } 
    } 

    handleChange(e,key){ 
     console.log(key) 

    console.log(e.target.checked) 

const newFruitsData = this.state.fruits.find(obj => { 
    obj.name === key ? obj.value = e.target.checked : '' 

}); 
console.log(newFruitsData) //why this is undefined?! 

    } 

    render() { 
    return (
     <div> 
     {this.state.fruits.map(obj => 
      <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> 
    ); 
    } 
} 

回答

0

你发现没有返回语句,它总是返回undefined,而它应该返回布尔

const newFruitsData = this.state.fruits.find(obj => obj.name === key && obj.value === e.target.checked); 
+0

看看,http://jsbin.com/betilanogo/1/edit 我用我们的代码。 – Mellisa

0

在handleChange()时,Array.prototype.find应该返回布尔:

handleChange(e,key){ 
    let nxState = Object.assign({}, this.state) 
    nxState.fruits.find(obj => { 
     if (obj.name === key) { 
     obj.value = e.target.checked 
     return true 
     } else { 
     return false 
     } 
    }); 
    this.setState(nxState) 
} 

而你应该使用setState()相反,它是我的课程

的意见---更新

Check it

+0

喜欢如何?像这样不起作用http://jsbin.com/bisadepeso/1/edit?html,js,console,output – Mellisa

+0

我已经更新了我的答案,请检查更新 – Kuawiiii