createElement
createElement
te permite crear un elemento React. Sirve como alternativa a la escritura de JSX.
const element = createElement(type, props, ...children)
Uso
Creando un elemento sin JSX
Si no te gusta JSX o no puedes usarlo en tu proyecto, puedes usar createElement
como alternativa.
Para crear un elemento sin JSX, llamas a createElement
con type, props y children:
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello ',
createElement('i', null, name),
'. Welcome!'
);
}
Los children son opcionales, y puedes pasar tantos como tu necesites (el ejemplo anterior tiene tres hijos). Este código mostrará un encabezado <h1>
con un saludo. A modo de comparación, aquà está el mismo ejemplo reescrito con JSX:
function Greeting({ name }) {
return (
<h1 className="greeting">
Hello <i>{name}</i>. Welcome!
</h1>
);
}
Para renderizar tu propio componente de React, pasas una función como Greeting
como el type en lugar de un 'h1'
:
export default function App() {
return createElement(Greeting, { name: 'Taylor' });
}
Con JSX, se verÃa asÃ:
export default function App() {
return <Greeting name="Taylor" />;
}
Aquà hay un ejemplo completo escrito con createElement
:
import { createElement } from 'react'; function Greeting({ name }) { return createElement( 'h1', { className: 'greeting' }, 'Hello ', createElement('i', null, name), '. Welcome!' ); } export default function App() { return createElement( Greeting, { name: 'Taylor' } ); }
Y aquà está el mismo ejemplo usando JSX:
function Greeting({ name }) { return ( <h1 className="greeting"> Hello <i>{name}</i>. Welcome! </h1> ); } export default function App() { return <Greeting name="Taylor" />; }
Ambos estilos de código están bien, por lo que puedes usar el que prefieras para tu proyecto. El principal beneficio de usar JSX en comparación con createElement
es que es fácil ver qué etiqueta de cierre corresponde a qué etiqueta de apertura.
Deep Dive
Qué es exactamente un elemento React?
Qué es exactamente un elemento React?
Un elemento es una descripción ligera de una pieza de la interfaz de usuario. Por ejemplo, ambos <Greeting name="Taylor" />
y createElement(Greeting, { name: 'Taylor' })
producen un objeto como este:
// Slightly simplified
{
type: Greeting,
props: {
name: 'Taylor'
},
key: null,
ref: null,
}
Ten en cuenta que crear este objeto no representa el componente Greeting
o crear cualquier elemento del DOM.
Un elemento React es más como una descripción — una instrucción para React para luego renderizar el componente Greeting
. Al devolver este objeto en tu componente App
, le dices a React qué hacer a continuación.
Crear elementos es extremadamente barato, por lo que no necesita intentar optimizarlo o evitarlo.
Referencia
createElement(type, props, ...children)
Llamar createElement
para crear un elemento de React con type
, props
, y children
.
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello'
);
}
Parámetros
-
type
: El argumentotype
debe ser un tipo de componente de React válido. Por ejemplo, podrÃa ser un string con el nombre de una etiqueta (como'div'
o'span'
), o un componente de React (una función, una clase, o un componente especial comoFragment
). -
props
: El argumentoprops
debe ser un objeto onull
. Si tu le pasasnull
, será tratado igual que un objecto vacio. React creará un elemento con props que coincidan con elprops
que tu has pasado. Ten en cuenta queref
ykey
de tu objectoprops
son especiales y lo harán no estar disponible comoelement.props.ref
yelement.props.key
en elelement
devuelto. Estarán disponibles comoelement.ref
yelement.key
. -
opcional
...children
: Cero o más nodos. Pueden ser cualquier nodo de React, incluidos Elementos de React, strings, números, portales, nodos vacÃos (null
,undefined
,true
, yfalse
), y arreglos con nodos de React.
Returns
createElement
devuelve un objecto React element con algunas propiedades:
type
: Eltype
que pasaste.props
: Losprops
que pasaste exceptoref
ykey
. Si eltype
es un componente contype.defaultProps
heredado, entonces cualquierprops
que falte oprops
indefinidas obtendrá los valores detype.defaultProps
.ref
: Elref
que pasaste. Si no lo pasaste es,null
.key
: Elkey
que pasaste, forzado a ser string. Si no lo pasaste es,null
.
Por lo general, devolverá el elemento de tu componente o lo convertirá en hijo de otro elemento. Aunque puedes leer las propiedades del elemento, es mejor tratar cada elemento como opaco después de su creación, y solo renderizarlo.
Advertencias
-
Debes tratar elementos React y sus props como immutables y nunca cambiar sus contenidos después de la creación. En desarrollo, React congelarÃa el elemento devuelto y su propiedad
props
para hacer cumplir esto. -
Cuando usas JSX, debe comenzar una etiqueta con una letra mayúscula para representar tu propio componente personalizado. En otras palabras,
<Something />
es equivalente acreateElement(Something)
, pero<something />
(minúscula) es equivalente acreateElement('something')
(ten encuenta que es un string, por lo que se tratará como una etiqueta de HTML normal). -
Solo deberÃas pasar children como múltiples argumentos para
createElement
si todos son estáticamente conocidos, comocreateElement('h1', {}, child1, child2, child3)
. Si tus children son dinámicos, pasa todo el arreglo como tercer argumento:createElement('ul', {}, listItems)
. Esto asegura que React advertirá sobre la falta dekey
s para cualquier lista dinámica. Para las listas estáticas, esto no es necesario porque nunca se reordenan.