Ich habe eine Liste von Optionen mit Kontrollkästchen und eine Schaltfläche innerhalb eines Elternteils ListView
. Wenn die Schaltfläche Fertig gedrückt wird, möchte ich wissen, welche der Kontrollkästchen aktiviert sind.Wie kann ich den Status der untergeordneten Checkbox-Komponenten in einer übergeordneten ListView-Komponente mithilfe von React-Native erhalten?
Ich sollte hinzufügen, dass ich versucht habe, ein Array der Kontrollkästchen in der ListView
mit Callback-Funktionen von ChildCheckBox
zu pflegen. Es funktionierte gut, außer beim Zurückgehen auf die ListView
würde das Array zurückgesetzt werden, während die Kontrollkästchen immer noch aktiviert schienen. Ich würde es vorziehen, die onDonePress()
Funktion nur abzufragen, welche Kästchen überprüft werden, dann entsprechend reagieren zu diesem Zeitpunkt, anstatt auf die ListView
Wartung eines Arrays angewiesen.
Hier ist die ListView
:
class ParentListView extends Component {
constructor(props) {
super(props);
this.state = {
dataSource: new ListView.DataSource({
rowHasChanged: (row1, row2) => row1 !== row2,
}),
};
}
componentDidMount() {
this.setState({
dataSource: this.state.dataSource.cloneWithRows(ROW_DATA),
});
}
onCheckPress() {
console.log('Check Pressed')
// callback from ChildCheckBoxCell...?
}
onDonePress() {
console.log('Done pressed')
// callback from ChildDoneCell...?
}
render() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this.renderRow.bind(this)}
style={styles.listView}
/>
);
}
renderRow(cell) {
if (cell.type === 'ChildCheckBoxCell') {
return (
<ChildCheckBoxCell onChange={() => this.onCheckPress()} />
);
}
if (cell.type === 'ChildDoneCell') {
return (
<ChildDoneCell onDonePress={() => this.onDonePress()}/>
);
}
}
}
Und hier ist die ChildCheckBoxCell
Komponente:
class ChildCheckBoxCell extends Component {
constructor(props) {
super(props);
this.state = {
isChecked: false,
};
}
onChange() {
this.setState({isChecked: !this.state.isChecked});
//Callback...
this.props.onChange();
}
render() {
return (
<TouchableHighlight onPress={() => this.onChange()}>
<Text>{this.state.isChecked? 'Checked' : 'UnChecked'}</Text>
</TouchableHighlight>
);
}
}
Und schließlich ist hier die ChildDoneCell
Komponente
class ChildDoneCell extends Component {
onDonePress() {
//Callback...
this.props.onDonePress();
}
render() {
return (
<TouchableHighlight onPress={() => this.onDonePress()}>
<Text>DONE</Text>
</TouchableHighlight>
);
}
}
Vielen Dank im Voraus!
Danke für die sehr detaillierte Antwort! Ich habe gerade versucht, es zu implementieren, und aus irgendeinem Grund reagiert die CheckboxCell nicht auf die Änderungen in der ListView. In Schritt 1 habe ich 'cell.isChecked =! Cell.isChecked', aber die Komponente und reagiert nicht auf diese Änderungen. Außerdem wird 'componentWillReceiveProps()' nicht in der 'CheckBoxCell' aufgerufen. –
Wenn Sie die Datenquelle aktualisieren, müssen Sie cloneWithRows verwenden. Kennen Sie das? – rclai
Der fehlende Link ist, dass ich die Datenquelle nicht aktualisiere, ich werde das jetzt versuchen, danke –