Mi piace la risposta relativa al passaggio delle funzioni in giro, è una tecnica molto utile.
Dall'altro lato è possibile ottenere questo risultato utilizzando pub/sub o utilizzando una variante, un dispatcher, come fa Flux. La teoria è semplicissima, la componente 5 invia un messaggio a cui il componente 3 sta ascoltando. Il componente 3 aggiorna il suo stato che attiva il ri-rendering. Ciò richiede componenti stateful, che, a seconda del punto di vista, possono o meno essere un anti-pattern. Sono contro di loro personalmente e preferirei che qualcos'altro sia in ascolto di dispatch e cambiamenti di stato dall'alto molto in basso (Redux fa questo, ma aggiunge una terminologia aggiuntiva).
import { Dispatcher } from flux
import { Component } from React
const dispatcher = new Dispatcher()
// Component 3
// Some methods, such as constructor, omitted for brevity
class StatefulParent extends Component {
state = {
text: 'foo'
}
componentDidMount() {
dispatcher.register(dispatch => {
if (dispatch.type === 'change') {
this.setState({ text: 'bar' })
}
}
}
render() {
return <h1>{ this.state.text }</h1>
}
}
// Click handler
const onClick = event => {
dispatcher.dispatch({
type: 'change'
})
}
// Component 5 in your example
const StatelessChild = props => {
return <button onClick={ onClick }>Click me</button>
}
I fasci dispatcher con Flux é molto semplice, esso registra semplicemente callback e invoca quando si verifica qualsiasi spedizione, passando attraverso i contenuti alla spedizione (nell'esempio terso sopra non c'è payload
con l'invio, semplicemente un messaggio ID). Puoi adattarlo a pub/sub tradizionali (ad esempio utilizzando EventEmitter dagli eventi, o qualche altra versione) molto facilmente se questo ha più senso per te.
fonte
2016-02-21 15:18:43
Perché avete bisogno di this.handler = this.handler.bind (questo) e non solo la funzione gestore che imposta lo stato? – chemook78
@ chemook78 in ES6 I metodi delle classi React non si associano automaticamente alla classe. Quindi, se non aggiungiamo 'this.handler = this.handler.bind (this)' nel costruttore, 'this' all'interno della funzione' handler' farà riferimento alla chiusura della funzione, non alla classe. Se non vuoi associare tutte le tue funzioni nel costruttore, ci sono altri due modi per gestirlo usando le funzioni freccia. Potresti semplicemente scrivere il gestore dei clic come 'onClick = {() => this.setState (...)}', oppure puoi utilizzare gli inizializzatori di proprietà insieme alle funzioni di freccia come descritto qui https://babeljs.io/blog/ 2015/06/07/react-on-es6-plus sotto "Funzioni freccia" – Ivan
Ecco un esempio di questo in azione: http://plnkr.co/edit/tGWecotmktae8zjS5yEr?p=preview – Tamb