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 garantit 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.