J'essaie de faire quelque chose comme ce qui suit dans React JSX
(où ObjectRow est un composant distinct):
<tbody>
for (var i=0; i < numrows; i++) {
<ObjectRow/>
}
</tbody>
Je me rends compte et je comprends pourquoi cela n'est pas valide JSX
, car il JSX
correspond aux appels de fonction. Cependant, venant de la terre des modèles et étant nouveau dans JSX
, je ne sais pas comment j'obtiendrais ce qui précède (en ajoutant un composant plusieurs fois).
javascript
reactjs
Ben Roberts
la source
la source
let todos = this.props.todos.map((todo) => {return <h1>{todo.title}</h1>})
let todos = this.props.todos.map(t => <h1>{t.title}</h1>)
:)Réponses:
Pensez-y comme si vous appeliez simplement des fonctions JavaScript. Vous ne pouvez pas utiliser une
for
boucle où iraient les arguments d'un appel de fonction:Voyez comment la fonction
tbody
passe unefor
boucle comme argument, et bien sûr, c'est une erreur de syntaxe.Mais vous pouvez créer un tableau, puis le passer en argument:
Vous pouvez utiliser essentiellement la même structure lorsque vous travaillez avec JSX:
Soit dit en passant, mon exemple JavaScript est presque exactement ce que cet exemple de JSX transforme. Jouez avec Babel REPL pour avoir une idée du fonctionnement de JSX.
la source
map
(par exemple, vous n'avez pas une collection stockée dans une variable).key
à chaque childern. REF: facebook.github.io/react/docs/…key
propriété et également un style de code qui n'est pas vraiment utilisé dans les bases de code React. Veuillez considérer cette réponse stackoverflow.com/questions/22876978/loop-inside-react-jsx/… comme une réponse correcte.Je ne sais pas si cela fonctionnera pour votre situation, mais souvent la carte est une bonne réponse.
Si c'était votre code avec la boucle for:
Vous pouvez l'écrire comme ceci avec la carte :
Syntaxe ES6:
la source
<tbody>{objects.map((o, i) => <ObjectRow obj={o} key={i}/>}</tbody>
en utilisant le support ES6 de Reactify ou Babel.<ul> {objects.map((object:string,i:number)=>{ return <li>{object}</li> })} </ul>
en utilisant TypeScriptfor..in
this.props.order.map((k)=><ObjectRow key={k} {...this.props.items[k]} />)
Si vous n'avez pas encore de tableau pour
map()
aimer la réponse de @ FakeRainBrigand, et que vous souhaitez l'inclure de sorte que la disposition source corresponde à la sortie plus proche que la réponse de @ SophieAlpert:Avec la syntaxe ES2015 (ES6) (fonctions de propagation et de flèche)
http://plnkr.co/edit/mfqFWODVy8dKQQOkIEGV?p=preview
Re: transpiling avec Babel, sa page de mises en garde dit que
Array.from
c'est nécessaire pour la propagation, mais à l'heure actuelle (v5.8.23
) cela ne semble pas être le cas lors de la propagation d'un réelArray
. J'ai un problème de documentation ouvert pour clarifier cela. Mais utilisez à vos risques et périls ou polyfill.Vanilla ES5
Array.apply
Inline IIFE
http://plnkr.co/edit/4kQjdTzd4w69g8Suu2hT?p=preview
Combinaison de techniques d'autres réponses
Conservez la disposition source correspondant à la sortie, mais rendez la partie en ligne plus compacte:
Avec la syntaxe et les
Array
méthodes ES2015Avec,
Array.prototype.fill
vous pouvez faire cela comme une alternative à l'utilisation de spread comme illustré ci-dessus:(Je pense que vous pourriez en fait omettre tout argument
fill()
, mais je ne suis pas à 100% là-dessus.) Merci à @FakeRainBrigand d'avoir corrigé mon erreur dans une version antérieure de lafill()
solution (voir les révisions).key
Dans tous les cas, l'
key
attr atténue un avertissement avec la build de développement, mais n'est pas accessible à l'enfant. Vous pouvez passer un attr supplémentaire si vous voulez que l'index soit disponible dans l'enfant. Voir Listes et clés pour discussion.la source
yield
? Pousser des éléments dans un tableau intermédiaire est un peu moche quand nous avons des générateurs. Travaillent-ils?[...Array(x)].map(() => <El />))
version, qui je pense est la plus élégante, et pourquoi je l'ai présentée. Re: la deuxième question, c'est un grand point. Il ne semble rien y avoir sur JSX qui l'empêche, donc cela dépend de ce que React ou un autre consommateur de JSX transformé fait avec les arguments enfants, ce que je ne pourrais pas dire sans regarder la source. Savez-vous? C'est une question intrigante.fill()
. Je me souviens maintenant que la raison pour laquelle j'hésitais à ce sujet est une question sur la façon dont le caractère optionnel des paramètres est indiqué dans la spécification ES (il faut que j'y réfléchisse un jour). La virgule n'est qu'un moyen d'éluder un élément de tableau - dans ce cas, le premier. Vous pouvez le faire si vous voulez que les index soient de 1..longueur du tableau que vous étalez plutôt que de 0..longueur-1 du tableau étalé (car les éléments élidés contribuent simplement à la longueur du tableau et ne ' t ont une propriété correspondante).En utilisant simplement la méthode map Array avec la syntaxe ES6:
N'oubliez pas la
key
propriété.la source
L'utilisation de la fonction Array map est un moyen très courant de parcourir un tableau d'éléments et de créer des composants en fonction de React , c'est un excellent moyen de faire une boucle qui est assez efficace et bien rangée pour faire vos boucles en JSX , ce n'est pas le seul façon de le faire, mais la façon préférée.
N'oubliez pas non plus d'avoir une clé unique pour chaque itération, au besoin. La fonction de carte crée un index unique à partir de 0, mais il n'est pas recommandé d'utiliser l'index produit, mais si votre valeur est unique ou s'il existe une clé unique, vous pouvez les utiliser:
En outre, quelques lignes de MDN si vous n'êtes pas familier avec la fonction de carte sur Array:
la source
Array#map
n'est pas asynchrone!Si vous utilisez déjà lodash, la
_.times
fonction est pratique.la source
Vous pouvez également extraire en dehors du bloc de retour:
la source
Je sais que c'est un vieux fil, mais vous voudrez peut- être vérifier les modèles React , qui vous permettent d'utiliser des modèles de style jsx dans react, avec quelques directives (telles que rt-repeat).
Votre exemple, si vous avez utilisé des modèles de réaction, serait:
la source
Il existe plusieurs façons de procéder. JSX est finalement compilé en JavaScript, donc tant que vous écrivez du JavaScript valide, vous serez bon.
Ma réponse vise à consolider toutes les merveilleuses façons déjà présentées ici:
Si vous n'avez pas de tableau d'objets, simplement le nombre de lignes:
dans le
return
bloc, en créantArray
et en utilisantArray.prototype.map
:en dehors du
return
bloc, utilisez simplement une boucle for JavaScript normale:expression de fonction immédiatement invoquée:
Si vous avez un tableau d'objets
dans le
return
bloc,.map()
chaque objet d'un<ObjectRow>
composant:en dehors du
return
bloc, utilisez simplement une boucle for JavaScript normale:expression de fonction immédiatement invoquée:
la source
si numrows est un tableau, et c'est très simple.
Le type de données de tableau dans React est très meilleur, le tableau peut sauvegarder un nouveau tableau et prendre en charge le filtre, réduire, etc.
la source
Il existe plusieurs réponses indiquant l'utilisation de la
map
déclaration. Voici un exemple complet utilisant un itérateur dans le composant FeatureList pour répertorier les composants Feature basés sur une structure de données JSON appelée features .Vous pouvez afficher le code FeatureList complet sur GitHub. Le dispositif de fonctionnalités est répertorié ici .
la source
Pour boucler plusieurs fois et revenir, vous pouvez y parvenir à l'aide de
from
etmap
:où
i = number of times
Si vous souhaitez attribuer des ID de clé uniques aux composants rendus, vous pouvez les utiliser
React.Children.toArray
comme proposé dans la documentation ReactReact.Children.toArray
Renvoie la structure de données opaque des enfants sous forme de tableau plat avec des clés affectées à chaque enfant. Utile si vous souhaitez manipuler des collections d'enfants dans vos méthodes de rendu, en particulier si vous souhaitez réorganiser ou découper this.props.children avant de le transmettre.
la source
Si vous choisissez de convertir cette méthode return () de la méthode de rendu , l'option la plus simple serait d'utiliser la méthode map () . Mappez votre tableau dans la syntaxe JSX à l'aide de la fonction map (), comme illustré ci-dessous (la syntaxe ES6 est utilisée ).
Composant parent intérieur :
Veuillez noter l'
key
attribut ajouté à votre composant enfant. Si vous n'avez pas fourni d'attribut clé, vous pouvez voir l'avertissement suivant sur votre console.Remarque: Une erreur courante est
index
que les gens utilisent comme clé lors de l'itération, l'utilisationindex
de l'élément comme clé est un anti-modèle et vous pouvez en lire plus ici . En bref, si ce n'est PAS une liste statique, n'utilisez jamaisindex
de clé.Maintenant, au niveau du composant ObjectRow , vous pouvez accéder à l'objet à partir de ses propriétés.
À l'intérieur du composant ObjectRow
const { object } = this.props
ou
const object = this.props.object
Cela devrait vous récupérer l'objet que vous avez passé du composant parent à la variable
object
dans le composant ObjectRow . Vous pouvez maintenant cracher les valeurs de cet objet en fonction de votre objectif.Références :
méthode map () en Javascript
ECMA Script 6 ou ES6
la source
disons que nous avons un tableau d'articles dans votre état:
la source
Une possibilité ES2015 / Babel utilise une fonction de générateur pour créer un tableau de JSX:
la source
... Ou vous pouvez également préparer un tableau d'objets et le mapper à une fonction pour obtenir la sortie souhaitée. Je préfère cela, car cela m'aide à maintenir la bonne pratique de codage sans logique à l'intérieur du retour de rendu.
la source
Utilisez simplement
.map()
pour parcourir votre collection et renvoyer les<ObjectRow>
articles avec des accessoires de chaque itération.En supposant qu'il
objects
y a un tableau quelque part ...la source
ES2015 Array.from avec la touche de fonction carte +
Si vous n'avez rien à
.map()
utiliserArray.from()
avec lamap
fonction pour répéter des éléments:la source
J'utilise ceci:
PS: n'oubliez jamais la clé ou vous aurez beaucoup d'avertissements!
la source
.Id
propriété, commeitems.map( (item, index) => <Foo key={index}>{item}</Foo>
J'ai tendance à privilégier une approche où la logique de programmation se produit en dehors de la valeur de retour de
render
. Cela aide à garder ce qui est réellement rendu facile à grok.Je ferais probablement quelque chose comme:
Certes, c'est une si petite quantité de code que l'inclure pourrait bien fonctionner.
la source
import { map } from 'lodash'
ce que vous n'importiez pas toutes les fonctions lodash si vous n'en avez pas besoin.map()
, uniquement des tableaux. C'est ce que je disais, lodash est bon pour faire une boucle sur un objet.objects
comme dans une liste de choses, mon erreur.vous pouvez bien sûr résoudre avec un .map comme suggéré par l'autre réponse. Si vous utilisez déjà babel, vous pourriez penser à utiliser les instructions jsx-control. Elles nécessitent un peu de réglage, mais je pense que cela vaut en termes de lisibilité (en particulier pour les développeurs non réactifs). Si vous utilisez un linter, il y a aussi des instructions eslint-plugin-jsx-control
la source
Votre code JSX sera compilé en code JavaScript pur, toutes les balises seront remplacées par des
ReactElement
objets. En JavaScript, vous ne pouvez pas appeler une fonction plusieurs fois pour collecter les variables renvoyées.C'est illégal, la seule façon est d'utiliser un tableau pour stocker les variables renvoyées par la fonction.
Ou vous pouvez utiliser
Array.prototype.map
ce qui est disponible depuis JavaScript ES5 pour gérer cette situation.Peut-être que nous pouvons écrire un autre compilateur pour recréer une nouvelle syntaxe JSX pour implémenter une fonction de répétition comme celle d' Angular
ng-repeat
.la source
Cela peut être fait de multiples façons.
return
stocker tous les éléments du tableauBoucle à l'intérieur
return
Méthode 1
Méthode 2
la source
Voici une solution simple.
Aucun mappage et code complexe requis. Il vous suffit de pousser les lignes vers le tableau et de renvoyer les valeurs pour le rendre.
la source
Puisque vous écrivez la syntaxe Javascript dans le code JSX, vous devez envelopper votre Javascript entre accolades.
la source
Voici un exemple de doc React: Expressions JavaScript en tant qu'enfants
comme votre cas, je suggère d'écrire comme ceci:
Veuillez noter que la clé est très importante, car React utilise la clé pour différer les données du tableau.
la source
Je l'utilise comme
la source
Vous pouvez faire quelque chose comme:
la source
Grande question.
Ce que je fais quand je veux ajouter un certain nombre de composants, c'est utiliser une fonction d'aide.
Définissez une fonction qui renvoie JSX:
la source
Vous pouvez également utiliser une fonction auto-invoquante:
la source