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’argument type 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 un Fragment).

  • props : l’argument props doit ĂȘtre soit un objet, soit null. Si vous passez null, il sera traitĂ© comme un objet vide. React crĂ©era l’élĂ©ment avec des props correspondant aux props que vous avez passĂ©es. Remarquez que les propriĂ©tĂ©s ref et key de votre objet props sont spĂ©ciales et ne seront pas disponibles en tant que element.props.ref et element.props.key sur l’element renvoyĂ©. Elles seront exposĂ©es en tant que element.ref et element.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 et false), et des tableaux de nƓuds React.

Valeur renvoyée

createElement renvoie un objet Ă©lĂ©ment React avec quelques propriĂ©tĂ©s :

  • type : le type que vous avez passĂ©.
  • props : les props que vous avez passĂ©es, sauf ref et key. Si le type est un composant dotĂ© de la propriĂ©tĂ© historique type.defaultProps, alors toute prop manquante ou undefined dans props prendra sa valeur depuis type.defaultProps.
  • ref : la ref que vous avez passĂ©e. ConsidĂ©rĂ©e null si manquante.
  • key : la key que vous avez passĂ©e, convertie en chaĂźne de caractĂšres. ConsidĂ©rĂ©e null 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 exemple createElement('h1', {}, child1, child2, child3). Si vos enfants sont dynamiques, passez leur tableau entier comme troisiĂšme argument : createElement('ul', {}, listItems). Ça garantit que React vous avertira en cas de key 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

Mais c’est quoi concrĂštement, un Ă©lĂ©ment React ?

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.