Tengo un componente que mostrará Array of String. El código se ve así.
React.createClass({
render() {
<div>
this.props.data.map(t => <span>t</span>)
</div>
}
})
Funciona perfectamente bien. es decir, si props.data = ['tom', 'jason', 'chris'] El resultado renderizado en la página sería tomjasonchris
Luego, quiero unir todos los nombres usando una coma, así que cambio el código a
this.props.data.map(t => <span>t</span>).join(', ')
Sin embargo, el resultado renderizado es [Objeto], [Objeto], [Objeto].
No sé cómo interpretar el objeto para que se convierta en componentes de reacción que se renderizarán. Cualquier sugerencia ?
If the array is empty and no initialValue was provided, TypeError would be thrown.
. por lo que no funcionará para una matriz vacía.prev
matriz. por ejemplo, se[1, 2, 3, 4]
convierte en[[[1,",",2],",",3],",",4]
..reduce((prev: JSX.Element, current: JSX.Element): any => [prev, (<span> </span>), current])
Puede utilizar
reduce
para combinar varios elementos de una matriz:Esto inicializa el acumulador con nulo, por lo que podemos envolver el primer elemento en una matriz. Para cada elemento siguiente en la matriz, construimos una nueva matriz que contiene todos los elementos anteriores usando
...-operator
, agregamos el separador y luego el siguiente elemento.Array.prototype.reduce ()
fuente
['a'].reduce((a, e) => [...a, ',', e],[])
rendimientos[",", "a"]
. No pasar ningún inicializador funciona a menos que la matriz esté vacía, en cuyo caso devuelve un TypeError.Actualización con React 16: ahora es posible renderizar cadenas directamente, por lo que puede simplificar su código eliminando todas las
<span>
etiquetas inútiles .fuente
La respuesta aceptada en realidad devuelve una matriz de matrices porque
prev
será una matriz cada vez. React es lo suficientemente inteligente como para hacer que esto funcione, pero es propenso a causar problemas en el futuro, como romper el algoritmo diferente de Reacts al dar claves para cada resultado del mapa.La nueva
React.Fragment
función nos permite hacer esto de una manera fácil de entender sin los problemas subyacentes.Con
React.Fragment
simplemente podemos colocar el separador,
fuera del HTML devuelto y React no se quejará.fuente
lo
<span>{t}</span>
que está devolviendo es un objeto, no una cadena. Consulte los documentos de reacción al respecto https://facebook.github.io/react/docs/jsx-in-depth.html#the-transformAl usar
.join()
en la matriz devuelta demap
, se une a la matriz de objetos.[object Object], ...
Puede poner la coma dentro del
<span></span>
para que se represente de la manera que desee.muestra: https://jsbin.com/xomopahalo/edit?html,js,output
fuente
Mi variante:
fuente
Si solo quiero representar una matriz de componentes separados por comas, generalmente encuentro
reduce
demasiado detallado. Una solución más corta en tales casos es{index > 0 && ', '}
representará una coma seguida de un espacio delante de todos los elementos de la matriz excepto el primero.Si desea separar el penúltimo elemento y el último por otra cosa, diga la cadena
' and '
, puede reemplazar{index > 0 && ', '}
confuente
Usando es6 podrías hacer algo como:
Y luego ejecuta:
fuente
Utilice una matriz anidada para mantener "," fuera.
Optimícelo guardando los datos en una matriz y modifique el último elemento en lugar de verificar si es su último elemento todo el tiempo.
fuente
Esto funcionó para mí:
fuente
Como mencionó Pith , React 16 le permite usar cadenas directamente, por lo que ya no es necesario envolver las cadenas en etiquetas span. Sobre la base de la respuesta de Maarten , si también desea lidiar con un mensaje personalizado de inmediato (y evitar arrojar un error en una matriz vacía), puede dirigir la operación con una declaración if ternaria en la propiedad de longitud en la matriz. Eso podría verse así:
fuente
Esto debería devolver una matriz plana. Maneje el caso con el primer objeto no iterable proporcionando una matriz vacía inicial y filtre la primera coma no necesaria del resultado
fuente
¿Soy el único que piensa que hay mucha propagación y anidamiento innecesarios en las respuestas aquí? Puntos por ser concisos, claro, pero deja la puerta abierta a problemas de escala o React cambiando la forma en que tratan con matrices / Fragmentos anidados.
Una matriz, sin anidamiento. Tampoco hay un método atractivo de encadenamiento, pero si se encuentra haciendo esto con frecuencia, siempre puede agregarlo al prototipo de matriz o envolverlo en una función que también tome una devolución de llamada de mapeo para hacerlo todo de una vez.
fuente
fuente