Una sola línea funciona bien
render: function () {
return (
{[1,2,3].map(function (n) {
return <p>{n}</p>
}}
);
}
no para varias líneas
render: function () {
return (
{[1,2,3].map(function (n) {
return (
<h3>Item {n}</h3>
<p>Description {n}</p>
)
}}
);
}
Gracias.
return ("asdf" "asdf");
quieresreturn ["asdf", "asdf"];
Respuestas:
Intente pensar en las etiquetas como llamadas a funciones (ver documentos ). Entonces el primero se convierte en:
Y el segundo:
Ahora debería quedar claro que el segundo fragmento realmente no tiene sentido (no puede devolver más de un valor en JS). Debe envolverlo en otro elemento (lo más probable es que desee, de esa manera también puede proporcionar una
key
propiedad válida ), o puede usar algo como esto:Con azúcar JSX:
No necesita aplanar la matriz resultante, React lo hará por usted. Vea el siguiente violín http://jsfiddle.net/mEB2V/1/ . Nuevamente: envolver los dos elementos en un div / sección probablemente sea mejor a largo plazo.
fuente
Uncaught Error: Invariant Violation: Product.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.
<div>{ this.props.foos.map(function() { return <Foo /> }) }</div>
. Pero larender
función del componente no puede devolver esa matriz sin envolverla, por ejemplo, en un div.Parece que la respuesta anterior sobre devolver una matriz ya no se aplica (tal vez desde React ~ 0.9, como escribió @ dogmatic69 en un comentario ).
Los documentos dicen que necesitas devolver un solo nodo:
En muchos casos, simplemente puede envolver las cosas en a
<div>
o a<span>
.En mi caso, quería devolver varios
<tr>
s. Los envolví en una<tbody>
- una mesa puede tener varios cuerpos.EDITAR: A partir de React 16.0, la devolución de una matriz aparentemente está permitida nuevamente, siempre que cada elemento tenga
key
: https://facebook.github.io/react/blog/2017/09/26/react-v16.0.html # new-render-return-types-fragments-and-stringsEDITAR: React 16.2 le permite rodear una lista de elementos con
<Fragment>…</Fragment>
o incluso<>…</>
, si lo prefiere a una matriz: https://blog.jmes.tech/react-fragment-and-semantic-html/fuente
<li>
? Suponiendo que no puedo simplemente envolverlo todo<ul>
<li><ul><li>one</li><li>two</li></ul></li>
si eso funciona en tu situación. O: ¿Un div de envoltura no sería estrictamente válido, pero tal vez funcione bien en todos los navegadores relevantes? Si lo prueba, avísenos.li
en unspan
odiv
no funcionó bien para mí. El div rompió seriamente la renderización y, al menos en mi caso de uso, el intervalo estropeó el CSS. 2 ¢: Intentar devolver varios subconjuntos deli
s es un olor a código. Estábamos usando aul
como una especie de menú desplegable, e inicialmente quería que muchos componentes devolvieran "secciones" deli
s. Al final, fue mejor poner todo el código del menú en un solo componente "anclado" enul
que calzar los correos electrónicosli
de múltiples fuentes. Creo que también hizo que el modelo mental de la interfaz de usuario fuera un poco más limpio.Desde React v16.0.0 en adelante, es posible Devolver múltiples elementos envolviéndolos dentro de un
Array
También desde React v16.2.0 ,
React Fragments
se introduce una nueva característica llamada que puede usar para envolver múltiples elementosSegún la documentación:
fuente
Además, es posible que desee devolver varios elementos de la lista en alguna función auxiliar dentro de un componente React. Simplemente devuelva una matriz de nodos html con el
key
atributo:fuente
Puede utilizar
createFragment
aquí.https://facebook.github.io/react/docs/create-fragment.html
(usando la sintaxis ES6 y JSX aquí)
primero tienes que agregar el
react-addons-create-fragment
paquete:Ventaja sobre la solución de Jan Olaf Krems: reaccionar no se queja de los desaparecidos
key
fuente
Actualizado
Utilice React Fragment. Es sencillo. Enlace a la documentación del fragmento.
Respuesta antigua: obsoleta
Con React> 16 puedes usar react-composite .
Por supuesto, debe instalarse react-composite.
fuente
Es simple por React fragment
<></>
yReact.Fragment
:fuente