J'essaie de rendre dynamiquement les composants en fonction de leur type.
Par exemple:
var type = "Example";
var ComponentName = type + "Component";
return <ComponentName />;
// Returns <examplecomponent /> instead of <ExampleComponent />
J'ai essayé la solution proposée ici noms de composants dynamiques React / JSX
Cela m'a donné une erreur lors de la compilation (en utilisant browserify pour gulp). Il attendait du XML là où j'utilisais une syntaxe de tableau.
Je pourrais résoudre cela en créant une méthode pour chaque composant:
newExampleComponent() {
return <ExampleComponent />;
}
newComponent(type) {
return this["new" + type + "Component"]();
}
Mais cela signifierait une nouvelle méthode pour chaque composant que je crée. Il doit y avoir une solution plus élégante à ce problème.
Je suis très ouvert aux suggestions.
{...this.props}
utile de transmettre de manière transparente les accessoires aux composants sous-typés du parent. Likereturn <MyComponent {...this.props} />
Une documentation officielle sur la manière de gérer de telles situations est disponible ici: https://facebook.github.io/react/docs/jsx-in-depth.html#choosing-the-type-at-runtime
En gros, il dit:
Faux:
Correct:
la source
Il devrait y avoir un conteneur qui mappe les noms des composants à tous les composants censés être utilisés de manière dynamique. Les classes de composants doivent être enregistrées dans un conteneur car dans un environnement modulaire, il n'y a pas d'autre endroit unique où ils pourraient être accédés. Les classes de composants ne peuvent pas être identifiées par leurs noms sans les spécifier explicitement car la fonction
name
est réduite en production.Carte des composants
Cela peut être un objet simple:
Ou
Map
exemple:L'objet simple est plus approprié car il bénéficie de la sténographie de propriété.
Module baril
Un module baril avec des exportations nommées peut agir comme une telle carte:
Cela fonctionne bien avec une classe par style de code de module.
Décorateur
Les décorateurs peuvent être utilisés avec des composants de classe pour le sucre syntaxique, cela nécessite toujours de spécifier les noms de classe explicitement et de les enregistrer dans une carte:
Un décorateur peut être utilisé comme composant d'ordre supérieur avec des composants fonctionnels:
L'utilisation de propriétés non standard
displayName
au lieu de propriétés aléatoires profite également au débogage.la source
J'ai trouvé une nouvelle solution. Notez que j'utilise des modules ES6 donc j'exige la classe. Vous pouvez également définir une nouvelle classe React à la place.
la source
default
attribut? ie: require ('./ ExampleComponent'). default?Si vos composants sont globaux, vous pouvez simplement faire:
la source
Components
tableau n'est pas défini.Pour un composant wrapper, une solution simple serait de simplement utiliser
React.createElement
directement (en utilisant ES6).la source
Dans toutes les options avec les cartes de composants, je n'ai pas trouvé le moyen le plus simple de définir la carte à l'aide de la syntaxe courte ES6:
la source
Avoir une carte n'a pas du tout l'air bien avec une grande quantité de composants. Je suis en fait surpris que personne n'ait suggéré quelque chose comme ça:
Celui-ci m'a vraiment aidé lorsque j'avais besoin de rendre une assez grande quantité de composants chargés sous une forme de tableau json.
la source
React.createElement(MyComponent)
directement a jeté une erreur. Plus précisément, je ne veux pas que le parent ait à connaître tous les composants à importer (dans un mappage) - car cela semble être une étape supplémentaire. Au lieu de cela, j'ai utiliséconst MyComponent = require("path/to/component/" + "ComponentNameString").default; return <MyComponent />
.Suspose nous souhaitons accéder à diverses vues avec chargement de composants dynamiques.Le code suivant donne un exemple de travail de la façon d'accomplir cela en utilisant une chaîne analysée à partir de la chaîne de recherche d'une URL.
Supposons que nous souhaitons accéder à une page `` snozberrys '' avec deux vues uniques en utilisant ces chemins d'URL:
et
nous définissons le contrôleur de notre vue comme ceci:
la source
Supposons que nous ayons un
flag
, pas différent dustate
ouprops
:Avec le drapeau,
Compo
remplissez avec l'un desComponentOne
ouComponentTwo
, puis leCompo
peut agir comme un composant React.la source
J'ai utilisé une approche un peu différente, car nous connaissons toujours nos composants réels, j'ai donc pensé appliquer un boîtier de commutation. Le nombre total de composants était également d'environ 7-8 dans mon cas.
la source
Edit: D'autres réponses sont meilleures, voir les commentaires.
J'ai résolu le même problème de cette façon:
la source
React.createElement
il sera appelé pour chaque composant de votre objet de recherche, même si un seul d'entre eux est rendu à la fois. Pire encore, en mettant l'objet de recherche dans larender
méthode du composant parent, il le refera à chaque fois que le parent est rendu. Les meilleures réponses sont un bien meilleur moyen d'atteindre la même chose.