ich Ihren Code ein wenig Refactoring und gegabelt Sie Stift hier: http://codepen.io/mrlew/pen/wgPjre
I cre ated ein myItems
Array in Staaten, die auf Basis Ihrer allElements
und selectedElements
Requisiten aufgebaut ist.
In Ihrem Konstruktor:
const myItems = props.allElements.map((item) => {
return {
value: item,
checked: (props.selectedElements.indexOf(item) > -1)
}
})
Jedes Element o dieser Array Spur der checked
Eigenschaft hält, als value
.
Auch können Sie die updateStateList
in der Callback-Aufruf .bind
mit einem Parameter (docs hier) anhängt. Auf diese Weise setzen Sie den this
Kontext und setzen einen zusätzlichen Parameter. Sehr nützlich in diesem Fall.
onClick={this.updateStateList.bind(this, item)}
Die updateStateList
Methode zuerst ein neues Array mit den neuen Werten (mit map
) und setState mit diesem neuen Array erstellen:
updateStateList(selectedItem, e){
let myNewItems = this.state.myItems.map((item) => {
if (item.value == selectedItem.value) item.checked = !selectedItem.checked
return item
})
this.setState({myItems: myNewItems})
}
nahm ich mir die Freiheit andere Sachen zu entfernen.
Hoffe es hilft!
Hinweis: Requisiten als Ausgangszustand vorbei ist nur ein empfehlenswertes Muster angesehen, wenn Ihre Mutterkomponente nicht über das Ergebnis schert, weil Sie Ihre Daten (zwei Quellen von thruth) desynchronisiert werden. Der "richtige" Ansatz wäre, dass ein Elternteil die Transformation durchführen würde, und Ihre Check-out-Checkbox würde nur Benutzer-Klick-Ereignisse verwerfen und das bereits berechnete Array-Objekt erhalten.