मुझे रिएक्ट नेटिव के नेविगेटर के साथ एक ही समस्या थी जिसे मैंने EventEmitters और Subscribables का उपयोग करके हल करने में कामयाब रहे। यह उदाहरण यहां वास्तव में सहायक था: https://colinramsay.co.uk/2015/07/04/react-native-eventemitters.html
मुझे बस इतना करना था कि ES6 और प्रतिक्रिया मूल के नवीनतम संस्करण के लिए अद्यतन किया गया था।
अनुप्रयोग के शीर्ष स्तर:
import React, { Component } from 'react';
import {AppRegistry} from 'react-native';
import {MyNavigator} from './components/MyNavigator';
import EventEmitter from 'EventEmitter';
import Subscribable from 'Subscribable';
class MyApp extends Component {
constructor(props) {
super(props);
}
componentWillMount() {
this.eventEmitter = new EventEmitter();
}
render() {
return (<MyNavigator events={this.eventEmitter}/>);
}
}
AppRegistry.registerComponent('MyApp',() => MyApp);
अपने नाविक की _renderScene समारोह में, सुनिश्चित करें कि आप "घटनाओं" प्रोप शामिल करना:
_renderScene(route, navigator) {
var Component = route.component;
return (
<Component {...route.props} navigator={navigator} route={route} events={this.props.events} />
);
}
और यहाँ FooScreen के लिए कोड है घटक जो एक सूचीदृश्य प्रस्तुत करता है।
(उच्च आदेश घटकों के पक्ष में ध्यान दें कि react-mixin आदेश घटना की सदस्यता के लिए यहां इस्तेमाल किया गया था ज्यादातर मामलों में mixins should be eschewed लेकिन मैं इस मामले में यह चारों ओर एक तरह से नहीं मिल सका।):
import React, { Component } from 'react';
import {
StyleSheet,
View,
ListView,
Text
} from 'react-native';
import {ListItemForFoo} from './ListItemForFoo';
import reactMixin from 'react-mixin'
import Subscribable from 'Subscribable';
export class FooScreen extends Component {
constructor(props) {
super(props);
this._refreshData = this._refreshData.bind(this);
this._renderRow = this._renderRow.bind(this);
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.state = {
dataSource: ds.cloneWithRows([])
}
}
componentDidMount(){
//This is the code that listens for a "FooSaved" event.
this.addListenerOn(this.props.events, 'FooSaved', this._refreshData);
this._refreshData();
}
_refreshData(){
this.setState({
dataSource: this.state.dataSource.cloneWithRows(//YOUR DATASOURCE GOES HERE)
})
}
_renderRow(rowData){
return <ListItemForFoo
foo={rowData}
navigator={this.props.navigator} />;
}
render(){
return(
<ListView
dataSource={this.state.dataSource}
renderRow={this._renderRow}
/>
)
}
}
reactMixin(FooScreen.prototype, Subscribable.Mixin);
अंत में।हम वास्तव में एक फू बचाने के बाद उस घटना का उत्सर्जन करने की जरूरत है:,
_onPressButton(){
//Some code that saves your Foo
this.props.events.emit('FooSaved'); //emit the event
this.props.navigator.pop(); //Pop back to your ListView component
}
आपने एक उत्तर स्वीकार कर लिया है। समस्या का सामना करने के लिए आपने जो कुछ किया है उसका एक उदाहरण साझा करने का कोई मौका है? –