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 as props correspondentes àsprops
que você passou. Note 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, portais, nós vazios (null
,undefined
,true
efalse
), e arrays de nós React.
Retornos
createElement
retorna um objeto de elemento React com algumas propriedades:
type
: Otype
que você passou.props
: Asprops
que você passou, exceto porref
ekey
. Se otype
for um componente comtype.defaultProps
legados, então qualquerprops
faltante ou indefinida obterá os valores detype.defaultProps
.ref
: Oref
que você passou. Se estiver ausente,null
.key
: Akey
que você passou, convertida em string. Se estiver ausente,null
.
Geralmente, você retornará o elemento do seu componente ou o tornará um 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. Em desenvolvimento, o React irá congelar o elemento retornado e sua propriedade
props
superficialmente para impor isso. -
Quando você usar JSX, você deve começar uma tag com letra maiúscula para renderizar seu próprio componente personalizado. Em outras palavras,
<Something />
é equivalente acreateElement(Something)
, mas<something />
(minúscula) é equivalente acreateElement('something')
(note que é uma string, então será tratado como uma tag HTML incorporada). -
Você deve passar filhos como múltiplos argumentos para
createElement
apenas se todos forem estaticamente conhecidos, comocreateElement('h1', {}, child1, child2, child3)
. Se seus filhos forem dinâmicos, passe o array inteiro como o terceiro argumento:createElement('ul', {}, listItems)
. Isso garante que o React avise você sobrekeys
faltantes para quaisquer listas dinâmicas. Para listas estáticas isso não é necessário, pois elas nunca são reordenadas.
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 alternativa.
Para criar um elemento sem JSX, chame createElement
com um 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 o 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 qualquer um 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 à 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:
// Levemente simplificado
{
type: Greeting,
props: {
name: 'Taylor'
},
key: null,
ref: null,
}
Note que criar este 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 para renderizar mais tarde 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 otimizar ou evitá-lo.