Se lo stai facendo semplicemente perché vuoi che il Bambino fornisca un tratto riutilizzabile ai suoi genitori, allora potresti considerare di farlo usando render-props .
Quella tecnica in realtà capovolge la struttura. L' Child
ora avvolge il genitore, quindi l'ho rinominato in AlertTrait
basso. Ho mantenuto il nome Parent
per continuità, anche se non è davvero un genitore ora.
// Use it like this:
<AlertTrait renderComponent={Parent}/>
class AlertTrait extends Component {
// You may need to bind this function, if it is stateful
doAlert() {
alert('clicked');
}
render() {
return this.props.renderComponent(this.doAlert);
}
}
class Parent extends Component {
render() {
return (
<button onClick={this.props.doAlert}>Click</button>
);
}
}
In questo caso, AlertTrait fornisce uno o più tratti che trasmette come oggetti di scena a qualunque componente gli sia stato dato renderComponent
.
Il genitore riceve doAlert
come oggetto di scena e può chiamarlo quando necessario.
(Per chiarezza, ho chiamato il sostegno renderComponent
nell'esempio sopra. Ma nei documenti React collegati sopra, lo chiamano semplicemente render
.)
Il componente Trait può eseguire il rendering di elementi che circondano il genitore, nella sua funzione di rendering, ma non rende nulla all'interno del genitore. In realtà potrebbe rendere le cose all'interno del genitore, se passasse un altro oggetto di scena (ad esrenderChild
) Al genitore, che il genitore potrebbe quindi utilizzare durante il suo metodo di rendering.
Questo è in qualche modo diverso da ciò che l'OP ha richiesto, ma alcune persone potrebbero finire qui (come abbiamo fatto noi) perché volevano creare un carattere riutilizzabile e pensavano che un componente figlio fosse un buon modo per farlo.