Ich bin ziemlich neu zu reagieren Native und einige Probleme mit dem Verständnis des gesamten Ökosystems davon. Wie auch immer, ich habe eine ListView und der Benutzer kann zu einer anderen View navigieren, um ein neues Element hinzuzufügen, das der Liste hinzugefügt wird. Wenn ich zurücktrete (Pop), wird die Liste nicht aktualisiert, da die Datenquelle in getInitialState zugewiesen wurde.React Native: Update-Ansicht (ListView) auf Navigator Pop
Wie kann ich die Ansicht zwingen, die Liste zu aktualisieren, wenn ich pop? Ist dies getan, indem die Route in onDidFocus des Navigators behandelt wird oder gibt es etwas, das ich dem eigentlichen ListView hinzufügen kann?
Haben eine verkleinerte Version des Codes zur Verfügung gestellt und es ist die Budget-Komponente und ihre Liste, die aktualisiert werden muss, wenn ein Pop-Ereignis aus dem Navigator war.
Index-Datei
var BudgetWatch_ReactNative = React.createClass({
renderScene(route, navigator){
if(route.name == 'Main'){
return React.createElement(route.component, {navigator});
}
if(route.name == 'Budgets'){
return React.createElement(route.component, {navigator, realm});
}
},
onDidFocus(route){
// Insert React Native magic?
},
render() {
return (
<Navigator
ref={(nav) => { navigator = nav; }}
style={{flex:1}}
initialRoute={{ name: 'Main', component: Main}}
renderScene={this.renderScene}
onDidFocus={this.onDidFocus}
navigationBar={
<Navigator.NavigationBar
routeMapper={NavigationBarRouteMapper(realm)}
/>
}/>
)
}
});
Budget-Komponente
class Budgets extends React.Component{
render(){
return (
<View>
<BudgetList navigator = {this.props.navigator}/>
</View>
)
}
}
var BudgetList = React.createClass({
getInitialState: function() {
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
return {
dataSource: ds.cloneWithRows(this.props.realm.objects('Budget')),
};
},
render: function() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this._renderRow}
/>
);
}
};
Hoffe, das ist genug für Sie, das Problem zu verstehen, danke!
Edit: Versucht, eine Funktion zu erreichen, die einen neuen Zustand mit Daten für die Liste von onDidFocus setzen wird. Da aber der Aufruf dieser Funktion über route.component.prototype.updateData (Daten) ist, this.setState returns „Kann nicht lesen Eigenschaft‚enqueueSetState‘undefinierte“
Änderungen widerzuspiegeln, sollten Sie Zustand Datasource durch Methode this.setState ändern. So rufen Sie bei jeder Änderung someMethod und in diesem someMethod this.setState ({dataSource: newDataSource}) auf. – NeoAsh
Ja, ich dachte, es könnte so gelöst werden, aber wie kann ich die Änderungen abfangen und eine Methode in dieser Komponente aufrufen. Von onDidFocus in meiner Hauptklasse kann ich nur auf die Route zugreifen oder kann ich vom untergeordneten Element der Liste auf die Methode zugreifen? Das ist von der Ansicht, die ein neues listitem hinzufügt, kann ich someMethod in BudgetList-Komponente aufrufen, die den Zustand aktualisieren wird, bevor ich pop? @NeoAsh – willedanielsson
Können Sie den vollständigen Code bereitstellen? (bei Github oder wo auch immer Sie sich wohl fühlen). – NeoAsh