Si vous faites cela simplement parce que vous voulez que l'enfant fournisse un trait réutilisable à ses parents, alors vous pourriez envisager de le faire en utilisant des accessoires de rendu à la place.
Cette technique bouleverse la structure. L' Childenveloppe maintenant le parent, donc je l'ai renommé ci- AlertTraitdessous. J'ai gardé le nom Parentde continuité, même si ce n'est plus vraiment un parent maintenant.
// 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>
);
}
}
Dans ce cas, le AlertTrait fournit un ou plusieurs traits qu'il transmet comme accessoires à n'importe quel composant qui lui a été donné dans son renderComponentaccessoire.
Le parent reçoit doAlertcomme accessoire et peut l'appeler en cas de besoin.
(Pour plus de clarté, j'ai appelé l'hélice renderComponentdans l'exemple ci-dessus. Mais dans les documents React liés ci-dessus, ils l'appellent juste render.)
Le composant Trait peut restituer des éléments entourant le parent, dans sa fonction de rendu, mais il ne rend rien à l'intérieur du parent. En fait, il pourrait rendre des choses à l'intérieur du parent, s'il passait un autre accessoire (par exemple renderChild) au parent, que le parent pourrait ensuite utiliser lors de sa méthode de rendu.
C'est quelque peu différent de ce que le PO a demandé, mais certaines personnes pourraient se retrouver ici (comme nous l'avons fait) parce qu'elles voulaient créer un trait réutilisable et pensaient qu'un composant enfant était un bon moyen de le faire.