J'ai un composant qui va afficher Array of String. Le code ressemble à ceci.
React.createClass({
render() {
<div>
this.props.data.map(t => <span>t</span>)
</div>
}
})
Cela fonctionne parfaitement bien. ie si props.data = ['tom', 'jason', 'chris'] Le résultat rendu dans la page serait tomjasonchris
Ensuite, je veux joindre tous les noms en utilisant une virgule, donc je change le code en
this.props.data.map(t => <span>t</span>).join(', ')
Cependant, le résultat rendu est [Objet], [Objet], [Objet].
Je ne sais pas comment interpréter l'objet pour devenir des composants de réaction à rendre. Toute suggestion ?
If the array is empty and no initialValue was provided, TypeError would be thrown.
. donc cela ne fonctionnera pas pour un tableau vide.prev
tableau.[1, 2, 3, 4]
devient par exemple[[[1,",",2],",",3],",",4]
..reduce((prev: JSX.Element, current: JSX.Element): any => [prev, (<span> </span>), current])
Vous pouvez utiliser
reduce
pour combiner plusieurs éléments d'un tableau:Cela initialise l'accumulateur avec null, nous pouvons donc envelopper le premier élément dans un tableau. Pour chaque élément suivant du tableau, nous construisons un nouveau tableau qui contient tous les éléments précédents à l'aide de
...-operator
, ajoutons le séparateur, puis l'élément suivant.Array.prototype.reduce ()
la source
['a'].reduce((a, e) => [...a, ',', e],[])
rendements[",", "a"]
. Ne pas transmettre d'initialiseur fonctionne à moins que le tableau ne soit vide, auquel cas il renvoie une TypeError.Mise à jour avec React 16: Il est désormais possible de rendre les chaînes directement, vous pouvez donc simplifier votre code en supprimant toutes les
<span>
balises inutiles .la source
La réponse acceptée renvoie en fait un tableau de tableaux car ce
prev
sera un tableau à chaque fois. React est assez intelligent pour que cela fonctionne, mais est-il susceptible de causer des problèmes à l'avenir, tels que la rupture de l'algorithme différent de Reacts lors de la fourniture de clés à chaque résultat de la carte.La nouvelle
React.Fragment
fonctionnalité nous permet de le faire d'une manière facile à comprendre sans les problèmes sous-jacents.Avec
React.Fragment
nous pouvons simplement placer le séparateur en,
dehors du HTML renvoyé et React ne se plaindra pas.la source
le que
<span>{t}</span>
vous renvoyez est un objet, pas une chaîne. Consultez les documents de réaction à ce sujet https://facebook.github.io/react/docs/jsx-in-depth.html#the-transformEn utilisant
.join()
sur le tableau renvoyé demap
, vous joignez le tableau d'objets.[object Object], ...
Vous pouvez mettre la virgule à l'intérieur du
<span></span>
afin qu'il soit rendu comme vous le souhaitez.exemple: https://jsbin.com/xomopahalo/edit?html,js,output
la source
Ma variante:
la source
Si je veux juste rendre un tableau de composants séparés par des virgules, je trouve généralement
reduce
trop verbeux. Une solution plus courte dans de tels cas est{index > 0 && ', '}
rendra une virgule suivie d'un espace devant tous les éléments du tableau sauf le premier.Si vous voulez séparer l'avant-dernier élément et le dernier par autre chose, dites la chaîne
' and '
, vous pouvez le remplacer{index > 0 && ', '}
parla source
En utilisant es6, vous pouvez faire quelque chose comme:
Et puis exécutez:
la source
Utilisez un tableau imbriqué pour garder "," à l'extérieur.
Optimisez-le en enregistrant les données dans un tableau et en modifiant le dernier élément au lieu de vérifier si son dernier élément tout le temps.
la source
Cela a fonctionné pour moi:
la source
Comme mentionné par Pith , React 16 vous permet d'utiliser des chaînes directement, de sorte que l'encapsulation des chaînes dans des balises span n'est plus nécessaire. En vous basant sur la réponse de Maarten , si vous souhaitez également traiter immédiatement un message personnalisé (et éviter de lancer une erreur sur un tableau vide), vous pouvez diriger l'opération avec une instruction if ternaire sur la propriété length du tableau. Cela pourrait ressembler à ceci:
la source
Cela devrait renvoyer un tableau plat. Gérer le cas avec le premier objet non itérable en fournissant un tableau vide initial et filtre la première virgule non nécessaire du résultat
la source
Suis-je le seul à penser qu'il y a beaucoup de propagation et de nidification inutiles dans les réponses ici? Il convient d'être concis, bien sûr, mais cela laisse la porte ouverte aux problèmes d'échelle ou de réaction modifiant la façon dont ils traitent les tableaux / fragments imbriqués.
Une baie, pas d'imbrication. Pas de chaînage de méthode sexy non plus, mais si vous vous retrouvez à faire cela souvent, vous pouvez toujours l'ajouter au prototype du tableau ou l'envelopper dans une fonction qui prend également un rappel de mappage pour tout faire en une seule fois.
la source
la source