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 argumentotypedeve 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 argumentopropsdeve 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 aopropsque você passou. Observe querefekeydo seu objetopropssão especiais e não estarão disponíveis comoelement.props.refeelement.props.keynoelementretornado. Eles estarão disponíveis comoelement.refeelement.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,trueefalse) e arrays de nós React.
Retorna
createElement retorna um objeto Elemento React com algumas propriedades:
type: Otypeque você passou.props: Opropsque você passou, excetorefekey.ref: Orefque você passou. Se estiver faltando,null.key: Okeyque 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
propssuperficialmente 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
createElementse 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 chaveskeyausentes 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.