2015-03-21 12 views
18

Ho una domanda sul passaggio di argomenti a React click handlers. Ho il seguente codice, ma per qualche motivo l'argomento nodo non viene passato alla funzione di commutazione. Non dovrebbe? È definito in questo modo perché è una componente ricorsiva.Argomento Pass per reactjs gestore di clic

var Element = React.createClass({ 

    toggle: function(e,node){ 

    }, 

    render: function(){ 

     var nodes = this.props.children.map(function(n){ 

       return <Element node={n} text={n.text} children={n.children} /> 

     }); 

     return (
       <span onClick={this.toggle.bind(this,this.props.node)}>{this.props.text}</span> 

     ); 
    } 

}); 
+0

Io non capisco pienamente perché ancora legherai sulla 'this.props.node'. Puoi semplicemente accedere a 'this.props.node' nel metodo di commutazione. –

+0

Non sono sicuro di poter seguire. Stai assegnando il risultato della tua chiamata alla mappa su una variabile dei nodi che non utilizzerai mai. Non capisco cosa dovrebbe fare o realizzare questo codice. –

risposta

23

Function.prototype.bind argomenti di collegamento a partire da sinistra. Il modo corretto per ricevere l'argomento nodo è cercarlo nella posizione più a sinistra della lista degli argomenti:

toggle: function(node, event) { 
    console.log('node', node); 
    console.log('event', event); 
} 

Vedi http://jsfiddle.net/8xxfgce7/ per un esempio.

+0

Devi fare qualcosa di sbagliato, questo funziona perfettamente bene: http://jsfiddle.net/8xxfgce7/ –

+0

Puoi totalmente impostare il valore di una proprietà su un nodo diverso, anche in una mappa. Il problema qui è che non si esegue il rendering della matrice 'nodes'. C'è un sacco di cose che non vanno nel tuo codice. Il modo canonico di assegnare a questo.proprio.children, è di passare i nodi come figli (''). Assegnare alla proprietà 'children' come' , ]} /> 'può funzionare, ma non è il modo canonico. Inoltre, una volta avviato il rendering dei 'nodi 'il codice terminerà in uno stack overflow perché la ricorsione non si interrompe mai. –

+1

Ho trovato il problema. È stato causato da un errore non correlato. Il mio male – TGH

0

Mentre la risposta sopra è corretta. Ecco un altro esempio di come passare entrambi gli eventi evento e parametro a onClick.

tuo sparare elemento evento per esempio un pulsante:

<button onClick={this.editTask.bind(this, item._id)}> 
    Edit item 
</button> 

funzione di gestione degli eventi:

editItem(id, event) { 
    event.preventDefault() // Prevents default form submission 
    console.log('id: ', id) // Prints the item id 
    . 
    . 
    . 
}