reactjs - siglas - ¿Cómo devolver varias líneas JSX en otra declaración de devolución en React?
react project with jsx (6)
Además, es posible que desee devolver varios elementos de la lista en alguna función auxiliar dentro de un componente Reaccionar. Simplemente devuelva una matriz de nodos html con el atributo key
:
import React, { Component } from ''react''
class YourComponent extends Component {
// ...
render() {
return (
<ul>
{this.renderListItems()}
</ul>
)
}
renderListItems() {
return [
<li key={1}><a href="#">Link1</a></li>,
<li key={2}><a href="#">Link2</a></li>,
<li key={3} className="active">Active item</li>,
]
}
}
Una sola línea funciona bien
render: function () {
return (
{[1,2,3].map(function (n) {
return <p>{n}</p>
}}
);
}
no para líneas múltiples
render: function () {
return (
{[1,2,3].map(function (n) {
return (
<h3>Item {n}</h3>
<p>Description {n}</p>
)
}}
);
}
Gracias.
Con React> 16 puedes usar react-composite .
import { Composite } from ''react-composite'';
// ...
{[1,2,3].map((n) => (
<Composite>
<h2>Title {n}</h2>
<p>Description {n}</p>
</Composite>
))};
Por supuesto, react-composite tiene que ser instalado.
npm install react-composite --save
Desde React v16.0.0 en adelante, es posible devolver varios elementos envolviéndolos dentro de una Array
render() {
return (
{[1,2,3].map(function (n) {
return [
<h3>Item {n}</h3>.
<p>Description {n}</p>
]
}}
);
}
También de React v16.2.0 , se introdujo una nueva característica llamada React Fragments
que puede usar para ajustar varios elementos
render() {
return (
{[1,2,3].map(function (n, index) {
return (
<React.Fragment key={index}>
<h3>Item {n}</h3>
<p>Description {n}</p>
</React.Fragment>
)
}}
);
}
Según la documentación:
Un patrón común en React es que un componente devuelva múltiples elementos. Los fragmentos le permiten agrupar una lista de niños sin agregar nodos adicionales al DOM.
Los fragmentos declarados con la sintaxis explícita pueden tener claves. Un caso de uso para esto es asignar una colección a una matriz de fragmentos; por ejemplo, para crear una lista de descripción:
function Glossary(props) { return ( <dl> {props.items.map(item => ( // Without the `key`, React will fire a key warning <React.Fragment key={item.id}> <dt>{item.term}</dt> <dd>{item.description}</dd> </React.Fragment> ))} </dl> ); }
la clave es el único atributo que se puede pasar a Fragment. En el futuro, podemos agregar soporte para atributos adicionales, como controladores de eventos.
Intenta pensar en las etiquetas como llamadas a funciones (ver docs ). Entonces el primero se convierte en:
{[1,2,3].map(function (n) {
return React.DOM.p(...);
})}
Y el segundo:
{[1,2,3].map(function (n) {
return (
React.DOM.h3(...)
React.DOM.p(...)
)
})}
Ahora debería estar claro que el segundo fragmento realmente no tiene sentido (no puede devolver más de un valor en JS). Tienes que envolverlo en otro elemento (lo más probable es que lo desees, de esa manera también puedes proporcionar una propiedad de key
válida), o puedes usar algo como esto:
{[1,2,3].map(function (n) {
return ([
React.DOM.h3(...),
React.DOM.p(...)
]);
})}
Con azúcar JSX:
{[1,2,3].map(function (n) {
return ([
<h3></h3>, // note the comma
<p></p>
]);
})}
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 una sección div / será mejor a largo plazo.
Parece que la antigua respuesta sobre devolver una matriz ya no se aplica (tal vez desde React ~ 0.9, como escribió @ dogmatic69 en un comentario ).
docs dicen que necesitas devolver un solo nodo:
Número máximo de nodos de raíz JSX
Actualmente, en el procesamiento de un componente, solo puede devolver un nodo; si tiene, por ejemplo, una lista de divs para devolver, debe envolver sus componentes dentro de un div, span o cualquier otro componente.
No olvide que JSX compila en JS regular; devolver dos funciones realmente no tiene sentido sintáctico. Del mismo modo, no pongas más de un niño en un ternario.
En muchos casos, simplemente puede ajustar las cosas en un <div>
o un <span>
.
En mi caso, quería devolver múltiples <tr>
s. Los envolví en <tbody>
- se permite que una mesa tenga múltiples cuerpos.
EDITAR: A partir de la Reacción 16.0, aparentemente se permite regresar una matriz, siempre que cada elemento tenga una key
: https://facebook.github.io/react/blog/2017/09/26/react-v16.0.html#new-render-return-types-fragments-and-strings
EDIT: 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/
Puede usar createFragment
aquí.
https://facebook.github.io/react/docs/create-fragment.html
import createFragment from ''react-addons-create-fragment'';
...
{[1,2,3].map((n) => createFragment({
h: <h3>...</h3>,
p: <p>...</p>
})
)}
(usando la sintaxis ES6 y JSX aquí)
primero debe agregar el paquete react-addons-create-fragment
:
npm install --save react-addons-create-fragment
Ventaja sobre la solución de Jan Olaf Krems: reaccionar no se queja de la key
falta