2017-05-13 2 views
3

Wie kann ich Funktionen von anderen Komponenten in react-native aufrufen?Funktionen von anderen Komponenten in react-native aufrufen

Ich habe diese benutzerdefinierte Komponente, die eine andere Komponente woanders definiert und eine Bildschaltfläche rendert. Wenn Sie auf das Bild tippen, möchte ich eine Funktion von der anderen Komponente aufrufen. Wenn das Beispiel der Ausführung unter I undefined is not an object (evaluating this.otherComponent.doSomething')

export default class MainComponent extends Component { 

    _onPressButton() { 
    this.otherComponent.doSomething(); 
    } 

    render() { 
    return (
     <View style={styles.container}> 
     <TagContainer style={styles.flow_container} ref={(instance) => this.otherComponent = instance}> 
     </TagContainer> 
     <TouchableHighlight onPress={this._onPressButton}><Image source={require('./img/ic_add.png')} style={styles.add_tags_button_view} /></TouchableHighlight> 
     </View> 
    ); 
    } 
} 

und

export default class OtherComponent extends Component { 

    addTag() { 
     this.state.tags = this.state.tags.push("plm"); 
     console.log('success..'); 
    } 

    .... 
} 
+0

sollte dies nicht sein: this.refs.otherComponent.addTag(); ? und funkysoul

+0

https://reactnatve.wordpress.com/2016/05/24/refs-to-components/ –

Antwort

5

Die direkte Kommunikation zwischen den Komponenten erhalten wird nicht empfohlen, weil es Verkapselung bricht. Es empfiehlt sich, eine Prop zu der Komponente zu senden und die Änderung in der Methode componentWillReceiveProps zu verarbeiten.

class Main extends React.Component { 
 
    constructor(props) { 
 
    super(props); 
 
    this.state = { value: 0 }; 
 
    this.handleClick = this.handleClick.bind(this); 
 
    } 
 
    
 
    handleClick(e) { 
 
    e.preventDefault(); 
 
    this.setState({ value: ++this.state.value }); 
 
    } 
 
    
 
    render() { 
 
    return (
 
     <div> 
 
     <a href="#" onClick={this.handleClick}>click me</a> 
 
     <Child value={this.state.value}/> 
 
     </div> 
 
    ); 
 
    } 
 
} 
 

 

 
class Child extends React.Component { 
 
    constructor(props) { 
 
    super(props); 
 
    
 
    this.state = { value: 0 }; 
 
    } 
 
    
 
    componentWillReceiveProps(nextProps) { 
 
    if(nextProps.value !== this.state.value) { 
 
     this.setState({ value: nextProps.value }); 
 
    } 
 
    } 
 
    
 
    render() { 
 
    return <div>{this.state.value}</div> 
 
    } 
 
} 
 

 

 
ReactDOM.render(<Main />, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="app"/>

+0

Große Antwort, könnten Sie erweitern auf this.handleClick = this.handleClick.bind (this) '. Es scheint nicht nötig zu sein. – Mick

+0

@Mick Ja, in diesem Fall ist es notwendig, um 'this' in der Funktion' handleClick' arbeiten zu lassen. https://reactjs.org/docs/handling-events.html – juliobetta

+0

Ich glaube, das ist eine andere Lösung, weil in der OPs Frage die andere Komponente den Zustand besitzt, nicht die Hauptkomponente. –

-2

Benötigen Sie haben nicht die Funktion innerhalb der Klasse definiert werden. Hier ist ein Beispiel

in dem helpers.js

export async function getAccessKey(){ 
let accessToken = await AsyncStorage.getItem(ACCESS_TOKEN); 
return accessToken; 
} 

in der anrufenden Klasse.

import { getAccessKey } from '../components/helpers'; 
... 
//inside the method 
     let key = await getAccessKey(); 
+0

Ihre Antwort hat nichts mit @ adi.neags Problem zu tun ... – juliobetta

Verwandte Themen