2015-07-15 4 views
0

J'essaie d'appeler une fonction d'un autre composant dans Réagir avec la bibliothèque Mousetrap.Réaction de la fonction d'appel JS dans un autre composant

class Parent extends React.Component { 
    constructor() { 
     super(); 

    } 
    ... 
    render() { 
     return(...); 
    } 
} 
class Child extends React.Component { 
    constructor() { 
     super(); 
     this.state = { show: false }; 
     this.open = this.open.bind(this); 
     this.close = this.close.bind(this); 
    } 
    open() { 
     this.setState({ show: true }); 
    } 
    close() { 
     this.setState({ show: true }); 
    } 
    render() { 
     return(...); 
    } 
} 

Maintenant, ce que je veux faire est d'appeler Mousetrap.bind('e', function(e) { Child.open() }); quelque part dans le parent (parce que le parent sera rendu, et que l'enfant ne sera rendu sur cette commande). Mais, je ne suis pas sûr d'où inclure cela. Serait-il préférable d'appeler cela dans le constructeur, ou quelque part dans render(), ou ailleurs ailleurs que je n'ai pas considéré?

+4

esprit si je vous demande pourquoi? D'après ce que vous avez montré, vous pourriez avoir 'show' à la place dans les accessoires de' Child', puis au lieu du parent 'open', le parent se re-rendrait avec une nouvelle valeur de' show' passée à l'enfant. – loganfsmyth

+0

Cela a du sens. Mais alors où pourrais-je inclure le code Mousetrap? –

Répondre

3

Il vaudrait mieux que cela fasse partie de votre état, par ex.

class Parent extends React.Component { 
    constructor(){ 
    super(); 
    this._eKeyPress = this._eKeyPress.bind(this); 
    this.state.showChild = false; 
    } 
    componentDidMount(){ 
    Mousetrap.bind('e', this._eKeyPress); 
    } 
    componentWillUnmount(){ 
    Mousetrap.unbind('e', this._eKeyPress); 
    } 
    _eKeyPress(){ 
    this.setState({showChild: true}); 
    } 

    render(){ 
    return <Child show={this.state.showChild} />; 
    } 
} 

La question suivante est de savoir si après cela vous devez créer l'enfant du tout, puisque vous pouvez également faire

render(){ 
    return this.state.showChild ? <Child /> : null; 
}