createElement
createElement
permite que você crie um Elemento React. Ele serve como uma alternativa para escrever JSX.
const element = createElement(type, props, ...children)
Referência
createElement(type, props, ...children)
Chame createElement
para criar um Elemento React com o type
, props
e children
fornecidos.
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello'
);
}
Parâmetros
-
type
: O argumentotype
deve ser um tipo de componente React válido. Por exemplo, pode ser uma string de nome de tag (como'div'
ou'span'
) ou um Componente React (uma função, uma classe ou um componente especial comoFragment
). -
props
: O argumentoprops
deve ser um objeto ounull
. Se você passarnull
, ele será tratado da mesma forma que um objeto vazio. O React criará um elemento com props correspondentes aoprops
que você passou. Observe queref
ekey
do seu objetoprops
são especiais e não estarão disponíveis comoelement.props.ref
eelement.props.key
noelement
retornado. Eles estarão disponíveis comoelement.ref
eelement.key
. -
opcional
...children
: Zero ou mais nós filhos. Eles podem ser quaisquer nós React, incluindo Elementos React, strings, números, portals, nós vazios (null
,undefined
,true
efalse
) e arrays de nós React.
Retorna
createElement
retorna um objeto Elemento React com algumas propriedades:
type
: Otype
que você passou.props
: Oprops
que você passou, excetoref
ekey
.ref
: Oref
que você passou. Se estiver faltando,null
.key
: Okey
que você passou, forçado a uma string. Se estiver faltando,null
.
Normalmente, você retornará o elemento do seu componente ou o tornará filho de outro elemento. Embora você possa ler as propriedades do elemento, é melhor tratar cada elemento como opaco após sua criação e apenas renderizá-lo.
Ressalvas
-
Você deve tratar os Elementos React e suas props como imutáveis e nunca alterar seu conteúdo após a criação. No desenvolvimento, o React irá congelar o elemento retornado e sua propriedade
props
superficialmente para impor isso. -
Quando você usa JSX, você deve iniciar uma tag com uma letra maiúscula para renderizar seu próprio componente customizado. Em outras palavras,
<Something />
é equivalente acreateElement(Something)
, mas<something />
(minúsculo) é equivalente acreateElement('something')
(observe que é uma string, então será tratado como uma tag HTML built-in). -
Você deve apenas passar filhos como múltiplos argumentos para
createElement
se todos forem estaticamente conhecidos, comocreateElement('h1', {}, child1, child2, child3)
. Se seus filhos forem dinâmicos, passe toda a array como o terceiro argumento:createElement('ul', {}, listItems)
. Isso garante que o React avise sobre chaveskey
ausentes para quaisquer listas dinâmicas. Para listas estáticas, isso não é necessário porque elas nunca reordenam.
Uso
Criando um elemento sem JSX
Se você não gosta de JSX ou não pode usá-lo em seu projeto, você pode usar createElement
como uma alternativa.
Para criar um elemento sem JSX, chame createElement
com algum type, props e children:
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello ',
createElement('i', null, name),
'. Welcome!'
);
}
Os children são opcionais, e você pode passar quantos precisar (o exemplo acima tem três filhos). Este código exibirá um cabeçalho <h1>
com uma saudação. Para comparação, aqui está o mesmo exemplo reescrito com JSX:
function Greeting({ name }) {
return (
<h1 className="greeting">
Hello <i>{name}</i>. Welcome!
</h1>
);
}
Para renderizar seu próprio Componente React, passe uma função como Greeting
como type em vez de uma string como 'h1'
:
export default function App() {
return createElement(Greeting, { name: 'Taylor' });
}
Com JSX, ficaria assim:
export default function App() {
return <Greeting name="Taylor" />;
}
Aqui está um exemplo completo escrito com 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' } ); }
E aqui está o mesmo exemplo escrito usando JSX:
function Greeting({ name }) { return ( <h1 className="greeting"> Hello <i>{name}</i>. Welcome! </h1> ); } export default function App() { return <Greeting name="Taylor" />; }
Ambos os estilos de codificação são bons, então você pode usar o que preferir para seu projeto. O principal benefício de usar JSX em comparação com createElement
é que é fácil ver qual tag de fechamento corresponde a qual tag de abertura.
Deep Dive
Um elemento é uma descrição leve de uma parte da interface do usuário. Por exemplo, tanto <Greeting name="Taylor" />
quanto createElement(Greeting, { name: 'Taylor' })
produzem um objeto como este:
// Slightly simplified
{
type: Greeting,
props: {
name: 'Taylor'
},
key: null,
ref: null,
}
Observe que a criação deste objeto não renderiza o componente Greeting
nem cria quaisquer elementos DOM.
Um Elemento React é mais como uma descrição - uma instrução para o React posteriormente renderizar o componente Greeting
. Ao retornar este objeto do seu Componente App
, você diz ao React o que fazer em seguida.
Criar elementos é extremamente barato, então você não precisa tentar otimizá-lo ou evitá-lo.