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' Child
enveloppe maintenant le parent, donc je l'ai renommé ci- AlertTrait
dessous. J'ai gardé le nom Parent
de 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 renderComponent
accessoire.
Le parent reçoit doAlert
comme accessoire et peut l'appeler en cas de besoin.
(Pour plus de clarté, j'ai appelé l'hélice renderComponent
dans 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.