De nombreux langages de modèles ont des instructions "slots" ou "yield", qui permettent de faire une sorte d'inversion de contrôle pour envelopper un modèle dans un autre.
Angular a l' option "transclude" .
Rails a une déclaration de rendement . Si React.js avait une instruction yield, cela ressemblerait à ceci:
var Wrapper = React.createClass({
render: function() {
return (
<div className="wrapper">
before
<yield/>
after
</div>
);
}
});
var Main = React.createClass({
render: function() {
return (
<Wrapper><h1>content</h1></Wrapper>
);
}
});
Sortie désirée:
<div class="wrapper">
before
<h1>content</h1>
after
</div>
Hélas, React.js n'a pas de fichier <yield/>
. Comment définir le composant Wrapper pour obtenir le même résultat?
Réponses:
Essayer:
Pour plus d'informations, consultez Composants multiples: enfants et type d'accessoires enfants dans la documentation.
la source
En utilisant
children
Ceci est également connu sous le nom
transclusion
de Angular.children
est un accessoire spécial dans React et contiendra ce qui est à l'intérieur des balises de votre composant (ici à l'<App name={name}/>
intérieurWrapper
, donc c'est lechildren
Notez que vous n'avez pas nécessairement besoin d'utiliser
children
, ce qui est unique pour un composant, et vous pouvez également utiliser des accessoires normaux si vous le souhaitez, ou mélanger des accessoires et des enfants:C'est simple et adapté à de nombreux cas d'utilisation, et je le recommande pour la plupart des applications grand public.
rendre les accessoires
Il est possible de passer des fonctions de rendu à un composant, ce modèle est généralement appelé
render prop
, et lechildren
prop est souvent utilisé pour fournir ce rappel.Ce modèle n'est pas vraiment destiné à la mise en page. Le composant wrapper est généralement utilisé pour contenir et gérer un état et l'injecter dans ses fonctions de rendu.
Exemple de compteur:
Vous pouvez obtenir encore plus de fantaisie et même fournir un objet
Notez que vous n'avez pas forcément besoin d'utiliser
children
, c'est une question de goût / API.À ce jour, de nombreuses bibliothèques utilisent des accessoires de rendu (contexte React, React-motion, Apollo ...) car les gens ont tendance à trouver cette API plus facile que celle des HOC. react-powerplug est une collection de composants de rendu simples. react-adopt vous aide à faire de la composition.
Composants d'ordre supérieur (HOC).
Un composant d'ordre supérieur / HOC est généralement une fonction qui prend un composant et renvoie un nouveau composant.
L'utilisation d'un composant d'ordre supérieur peut être plus performante que l'utilisation de
children
ourender props
, car le wrapper peut avoir la capacité de court-circuiter le rendu avec une longueur d'avanceshouldComponentUpdate
.Ici, nous utilisons
PureComponent
. Lors du re-rendu de l'application, si leWrappedApp
nom de prop ne change pas au fil du temps, le wrapper a la capacité de dire "Je n'ai pas besoin de rendre parce que les accessoires (en fait, le nom) sont les mêmes qu'avant". Avec lachildren
solution basée ci-dessus, même si le wrapper estPureComponent
, ce n'est pas le cas car l'élément children est recréé à chaque fois que le parent est rendu, ce qui signifie que le wrapper sera probablement toujours rendu, même si le composant enveloppé est pur. Il existe un plugin babel qui peut aider à atténuer cela et à garantir unchildren
élément constant dans le temps.Conclusion
Les composants d'ordre supérieur peuvent vous offrir de meilleures performances. Ce n'est pas si compliqué, mais cela semble certainement inamical au début.
Ne migrez pas toute votre base de code vers HOC après avoir lu ceci. N'oubliez pas que sur les chemins critiques de votre application, vous voudrez peut-être utiliser des HOC au lieu de wrappers d'exécution pour des raisons de performances, en particulier si le même wrapper est utilisé plusieurs fois, il vaut la peine d'en faire un HOC.
Redux a d'abord utilisé un wrapper d'exécution
<Connect>
et est ensuite passé à un HOCconnect(options)(Comp)
pour des raisons de performances (par défaut, le wrapper est pur et utiliséshouldComponentUpdate
). C'est l'illustration parfaite de ce que je voulais mettre en évidence dans cette réponse.Notez que si un composant a une API de rendu-prop, il est généralement facile de créer un HOC par-dessus, donc si vous êtes un auteur de lib, vous devez d'abord écrire une API de prop de rendu, et éventuellement proposer une version HOC. C'est ce que fait Apollo avec le
<Query>
composant render-prop, et legraphql
HOC qui l'utilise.Personnellement, j'utilise les deux, mais en cas de doute je préfère les HOC car:
compose(hoc1,hoc2)(Comp)
) par rapport aux accessoires de renduJe n'hésite pas à utiliser / créer des versions HOC de mes outils préférés:
Context.Consumer
compSubscribe
graphql
HOC of Apollo au lieu deQuery
render propA mon avis, parfois les accessoires de rendu rendent le code plus lisible, parfois moins ... J'essaye d'utiliser la solution la plus pragmatique en fonction des contraintes que j'ai. Parfois, la lisibilité est plus importante que les performances, parfois non. Choisissez judicieusement et ne suivez pas la tendance 2018 de tout convertir en accessoires de rendu.
la source
En plus de la réponse de Sophie, j'ai également trouvé une utilisation dans l'envoi de types de composants enfants, en faisant quelque chose comme ceci:
la source
delegate
, comment l'avez-vous trouvée?