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’argumenttype
doit ê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’argumentprops
doit ê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 auxprops
que vous avez passées. Remarquez que les propriétésref
etkey
de votre objetprops
sont spéciales et ne seront pas disponibles en tant queelement.props.ref
etelement.props.key
sur l’element
renvoyé. Elles seront exposées en tant queelement.ref
etelement.key
. -
...children
optionnels : 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
,true
etfalse
), et des tableaux de nœuds React.
Valeur renvoyée
createElement
renvoie un objet élément React avec quelques propriétés :
type
: letype
que vous avez passé.props
: lesprops
que vous avez passées, saufref
etkey
. Si letype
est un composant doté de la propriété historiquetype.defaultProps
, alors toute prop manquante ouundefined
dansprops
prendra sa valeur depuistype.defaultProps
.ref
: laref
que vous avez passée. Considéréenull
si manquante.key
: lakey
que vous avez passée, convertie en chaîne de caractères. Considéréenull
si 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 à
createElement
que 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 dekey
manquantes 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.