2016-04-18 19 views
7

Nel dritto fino jQuery, posso fare qualcosa di simileCome gestire eventi Bootstrap speciali in React?

$('#myCollapsible').on('click', 'hidden.bs.collapse', function() { 
    // do something… 
}) 

ma c'è un modo "giusto" per farlo in Reagire? Se quanto sopra è la strada da percorrere, dove dovrei posizionare quel gestore di eventi? Si prega di notare che io sono non utilizzando il plugin react-bootstrap.

risposta

16

Il modo giusto per gestire gli eventi non direttamente supportate da React è aggiungendo un ascoltatore evento al nodo DOM dopo monti componenti, e la rimozione quando le disattivazioni componenti:

class MyCollapsible extends React.Component { 
 
    constructor() { 
 
    super() 
 
    // Bind the method in the constructor instead of binding it in render, so you only do it once 
 
    this.handleHiddenBsCollapse = this.handleHiddenBsCollapse.bind(this) 
 
    } 
 

 
    componentDidMount() { 
 
    this.myCollapsible.addEventListener('hidden.bs.collapse', this.handleHiddenBsCollapse) 
 
    } 
 

 
    componentWillUnmount() { 
 
    this.myCollapsible.removeEventListener('hidden.bs.collapse', this.handleHiddenBsCollapse) 
 
    } 
 

 
    handleHiddenBsCollapse(event) { 
 
    // Do something... 
 
    } 
 

 
    render() { 
 
    // Settings refs with node => this.bla = node is recommended 
 
    // because this.refs is deprecated. 
 
    // in this example "node" is the DOM node itself, not a react reference 
 
    return (
 
     <div ref={node => (this.myCollapsible = node)} /> 
 
    ) 
 
    } 
 
}

Documentazione per l'utilizzo di riferimenti DOM: https://facebook.github.io/react/docs/refs-and-the-dom.html

+0

Strano. Non sto ottenendo gli eventi. Quando guardo il nodo negli strumenti di Chrome, i gestori sono lì. I gestori che ho aggiunto con jQuery '$ ('. Panel'). On (" hidden.bs.collapse ", tc);' appaiono come 'nascosti' e' mostra' e si attivano. –

+0

Verificare che i binding siano corretti nella versione di reazione. Prova anche '(foo, bar) => this.handleHiddenBsCollapse (foo, bar)' come gestore di eventi in 'addEventListener' per vedere cosa stai ottenendo esattamente. –

+0

Penso che il problema è che gli eventi jQuery sono "namespace" in un modo che non funziona con addEventListeners. –

Problemi correlati