2016-12-26 67 views
1

我用SetState更改父級的狀態有問題。首先,我有我的RootView.jsx有:SetState to parent

constructor(props) { 
     super(props); 
     this.state = { 
sizes: [ 
       {label: "90x50mm", isChecked: false, number: 10}, 
       {label: "85x55mm", isChecked: false, number: 12} 
      ], 
      ratings: [ 
       {label: "OneStar", isChecked: false, imgSrc: 'images/Rating1Star.svg', counter: 22}, 
       {label: "TwoStars", isChecked: false, imgSrc: 'images/Rating2Stars.svg', counter: 18}, 
       {label: "ThreeStars", isChecked: false, imgSrc: 'images/Rating3Stars.svg', counter: 34}, 
       {label: "FourStars", isChecked: false, imgSrc: 'images/Rating4Stars.svg', counter: 27} 
      ], 
      favorites: [ 
       {label: "Only favorites", isChecked: false, number: 12} 
      ] 
} 

_setProps() { 
    this.setState({ 
     isChecked: !this.state.isChecked 
    }); 
} 

然後林創造不同的組件複選框的所有元素,例如:

return (
      this.props.sizes.map((size, idx) => { 
       return (
        <Checkbox 
         key={"size"+idx} 
         label={size.label} 
         checked={size.isChecked} 
         number={size.number} 
         _setProps={size.props._setProps()} 
        /> 
       ) 
      }) 
     ) 

與我的CheckBox組件,在我有:

render() { 
     return (
      <div className="Checkbox"> 
       <form> 
        <input 
         type="checkbox" 
         id="check" 
         onClick={this.props._setProps.bind(this)} 
        /> 
        <img src={this.props.imgSrc}/> 
        <label htmlFor="check" id="label">{this.props.label}</label> 
        <label htmlFor="check" id="number">{this.props.number}</label> 
       </form> 
      </div> 
     ) 
    } 

和我的onClick我想改變狀態的數組中的一個元素在RootView.jsx

這可能嗎?

+0

你想更新每個陣列的缺陷? – Codesingh

+0

沒有,只爲這個被點擊的元素 – dobro

+0

但缺省是在裏面的大小,評分和收藏夾 – Codesingh

回答

0

是的,你需要通過你與

return (
      this.props.sizes.map((size, idx) => { 
       return (
        <Checkbox 
         key={"size"+idx} 
         index={idx} 
         label={size.label} 
         checked={size.isChecked} 
         number={size.number} 
         _setProps={this.props._setProps.bind(this)} 
        /> 
       ) 
      }) 
     ) 

而在你的CheckBox組件創建複選框元素的數組元素的索引發送此指標作爲參數

render() { 
    return (
     <div className="Checkbox"> 
      <form> 
       <input 
        type="checkbox" 
        id="check" 
        onClick={this.props._setProps.bind(this, this.props.index)} 
       /> 
       <img src={this.props.imgSrc}/> 
       <label htmlFor="check" id="label">{this.props.label}</label> 
       <label htmlFor="check" id="number">{this.props.number}</label> 
      </form> 
     </div> 
    ) 
} 

而變化狀態如下

_setProps(idx) { 
    var sizes = this.state.sizes; 
    sizes[idx]["ischecked"] = !sizes[idx]["ischecked"]; 
    this.setState({ 
     sizes: sizes 
    }); 
} 

我希望它能幫你解決問題

+0

謝謝,但這個解決方案只解決了一部分問題,但不是一個完整的問題。我不想改變isSelected狀態我有幾個數組與不同的過濾器,你可以點擊過濾器從數組大小或數組評級或從幾個更多,我希望它與我所有的陣列工作...希望它的理解 – dobro

+0

你可以做類似對於其他陣列也是 – Codesingh

+0

是的,我意識到這一點,我希望可能有某種方法可以讓這個功能適用於每個陣列,所以我只需要一個而不是5個或10個 – dobro