createElement
createElement vous permet de créer un élément React. Elle est utile si vous ne voulez pas (ou ne pouvez pas) écrire du JSX.
const element = createElement(type, props, ...children)Référence
createElement(type, props, ...children)
Appelez createElement pour créer un élément React avec un type, des props et des children.
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Bonjour'
);
}Voir d’autres exemples ci-dessous.
Paramètres
-
type: l’argumenttypedoit être un type de composant React valide. Par exemple, ce pourrait être un nom de balise (tel que'div'ou'span') ou un composant React (une fonction, une classe ou un composant spécial comme unFragment). -
props: l’argumentpropsdoit être soit un objet, soitnull. Si vous passeznull, il sera traité comme un objet vide. React créera l’élément avec des props correspondant auxpropsque vous avez passées. Remarquez que les propriétésrefetkeyde votre objetpropssont spéciales et ne seront pas disponibles en tant queelement.props.refetelement.props.keysur l’elementrenvoyé. Elles seront exposées en tant queelement.refetelement.key. -
...childrenoptionnels : une série quelconque de nœuds enfants. Il peut s’agir de n’importe quels nœuds React, y compris des éléments React, des chaînes de caractères, des nombres, des portails, des nœuds vides (null,undefined,trueetfalse), et des tableaux de nœuds React.
Valeur renvoyée
createElement renvoie un objet élément React avec quelques propriétés :
type: letypeque vous avez passé.props: lespropsque vous avez passées, saufrefetkey. Si letypeest un composant doté de la propriété historiquetype.defaultProps, alors toute prop manquante ouundefineddanspropsprendra sa valeur depuistype.defaultProps.ref: larefque vous avez passée. Considéréenullsi manquante.key: lakeyque vous avez passée, convertie en chaîne de caractères. Considéréenullsi manquante.
En général, vous renverrez l’élément depuis votre composant, ou en ferez l’enfant d’un autre élément. Même si vous pourriez lire les propriétés de l’élément, il vaut mieux traiter tout objet élément comme une boîte noire après sa création, et vous contenter de l’afficher.
Limitations
-
Vous devez traiter les éléments React et leurs props comme immuables et ne jamais changer leur contenu après création. En développement, React gèlera l’élément renvoyé, ainsi que sa propriété
props(à un niveau de profondeur), pour garantir cet aspect. -
Quand vous utilisez JSX, vous devez faire démarrer le nom de la balise par une lettre majuscule afin d’afficher votre propre composant. En d’autres termes,
<Something />est équivalent àcreateElement(Something), mais<something />(minuscules) est équivalent àcreateElement('something')(remarquez qu’il s’agit ici d’une chaîne de caractères, qui sera donc traitée comme une balise HTML native). -
Vous ne devriez passer les enfants comme arguments multiples à
createElementque s’ils sont statiquement connus, comme par exemplecreateElement('h1', {}, child1, child2, child3). Si vos enfants sont dynamiques, passez leur tableau entier comme troisième argument :createElement('ul', {}, listItems). Ça garantir que React vous avertira en cas dekeymanquantes lors de listes dynamiques. C’est inutile pour les listes statiques puisque leur ordre et leur taille ne changent jamais.
Utilisation
Créer un élément sans JSX
Si vous n’aimez pas JSX ou ne pouvez pas l’utiliser dans votre projet, vous pouvez utiliser createElement comme alternative.
Pour créer un élément sans JSX, appelez createElement avec un type, des props et des enfants :
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Bonjour ',
createElement('i', null, name),
'. Bienvenue !'
);
}Les enfants sont optionnels, et vous pouvez en passer autant que vous le souhaitez (l’exemple ci-dessus a trois enfants). Ce code affichera un en-tête <h1> avec un message de bienvenue. À titre de comparaison, voici le même exemple utilisant JSX :
function Greeting({ name }) {
return (
<h1 className="greeting">
Bonjour <i>{name}</i>. Bienvenue !
</h1>
);
}Pour afficher votre propre composant React, passez une fonction telle que Greeting comme type, plutôt qu’une chaîne de caractères comme 'h1' :
export default function App() {
return createElement(Greeting, { name: 'Clara' });
}En JSX, ça donnerait ceci :
export default function App() {
return <Greeting name="Clara" />;
}Voici un exemple complet écrit avec createElement :
import { createElement } from 'react'; function Greeting({ name }) { return createElement( 'h1', { className: 'greeting' }, 'Bonjour ', createElement('i', null, name), '. Bienvenue !' ); } export default function App() { return createElement( Greeting, { name: 'Clara' } ); }
Et voici le même écrit en JSX :
function Greeting({ name }) { return ( <h1 className="greeting"> Bonjour <i>{name}</i>. Bienvenue ! </h1> ); } export default function App() { return <Greeting name="Clara" />; }
Les deux styles sont acceptables, vous pouvez donc utiliser celui que vous préférez dans votre projet. L’avantage principal de JSX, comparé à createElement, c’est qu’il est plus facile de voir où les éléments commencent et où ils finissent.
En détail
Un élément est une description légère d’un bout de votre interface utilisateur. Par exemple, tant <Greeting name="Clara" /> que createElement(Greeting, { name: 'Clara' }) produisent un objet comme celui-ci :
// Légèrement simplifié
{
type: Greeting,
props: {
name: 'Clara'
},
key: null,
ref: null,
}Remarquez que la seule création de l’objet ne suffit pas à afficher le composant Greeting, et ne crée pas non plus d’éléments DOM.
Un élément React est plus comme une description — des instructions pour React, afin qu’il puisse plus tard afficher le composant Greeting. En renvoyant cet objet depuis votre composant App, vous indiquez à React quoi faire ensuite.
La création d’éléments a un coût quasi nul, vous n’avez donc pas besoin de l’optimiser ou de chercher activement à l’éviter.