React
JSX
Recherche…
Remarques
JSX est une étape de préprocesseur qui ajoute la syntaxe XML à JavaScript. Vous pouvez certainement utiliser React sans JSX, mais JSX rend React beaucoup plus élégant.
Tout comme XML, les balises JSX ont un nom de balise, des attributs et des enfants. Si une valeur d'attribut est entre guillemets, la valeur est une chaîne. Sinon, placez la valeur entre accolades et la valeur est l'expression JavaScript incluse.
Fondamentalement, JSX ne fournit que du sucre syntaxique pour la fonction React.createElement(component, props, ...children)
.
Donc, le code JSX suivant:
class HelloMessage extends React.Component {
render() {
return <div>Hello {this.props.name}</div>;
}
}
ReactDOM.render(<HelloMessage name="Kalo" />, mountNode);
Compile jusqu'au code JavaScript suivant:
class HelloMessage extends React.Component {
render() {
return React.createElement(
"div",
null,
"Hello ",
this.props.name
);
}
}
ReactDOM.render(React.createElement(HelloMessage, { name: "Kalo" }), mountNode);
En conclusion, notez que la ligne suivante dans JSX n'est ni une chaîne ni un HTML :
const element = <h1>Hello, world!</h1>;
Il s'appelle JSX, et c'est une extension de syntaxe pour JavaScript . JSX peut vous rappeler un langage de modèle, mais il est livré avec toute la puissance de JavaScript.
L'équipe React indique dans ses documents qu'ils recommandent de l'utiliser pour décrire ce que l'interface utilisateur devrait ressembler.
Accessoires dans JSX
Il existe plusieurs façons de spécifier des accessoires dans JSX.
Expressions JavaScript
Vous pouvez transmettre n'importe quelle expression JavaScript en prop, en l'entourant de {}
. Par exemple, dans cette JSX:
<MyComponent count={1 + 2 + 3 + 4} />
Dans le MyComponent
, la valeur de props.count
sera 10
, car l'expression 1 + 2 + 3 + 4
est évaluée.
Si les instructions et les boucles ne sont pas des expressions en JavaScript, elles ne peuvent pas être utilisées directement dans JSX.
Littéraux de chaîne
Bien sûr, vous pouvez simplement transmettre n'importe quelle string literal
comme un prop
. Ces deux expressions JSX sont équivalentes:
<MyComponent message="hello world" />
<MyComponent message={'hello world'} />
Lorsque vous passez un littéral de chaîne, sa valeur est HTML-sans-échappement. Donc, ces deux expressions JSX sont équivalentes:
<MyComponent message="<3" />
<MyComponent message={'<3'} />
Ce comportement n'est généralement pas pertinent. C'est seulement mentionné ici pour être complet.
Valeur par défaut des accessoires
Si vous ne transmettez aucune valeur pour un accessoire, la valeur par défaut est true
. Ces deux expressions JSX sont équivalentes:
<MyTextBox autocomplete />
<MyTextBox autocomplete={true} />
Cependant, l’équipe React affirme que cette approche n’est pas recommandée dans ses documents, car elle peut être confondue avec l’objet abrégé ES6 {foo}
qui est l'abréviation de {foo: foo}
plutôt que {foo: true}
. Ils disent que ce comportement est juste là pour qu'il corresponde au comportement de HTML.
Attributs de diffusion
Si vous avez déjà des objets en tant qu'objet et que vous souhaitez les transmettre dans JSX, vous pouvez utiliser ...
tant qu'opérateur de diffusion pour transmettre l'objet de l'ensemble des objets. Ces deux composants sont équivalents:
function Case1() {
return <Greeting firstName="Kaloyab" lastName="Kosev" />;
}
function Case2() {
const person = {firstName: 'Kaloyan', lastName: 'Kosev'};
return <Greeting {...person} />;
}
Enfants à JSX
Dans les expressions JSX qui contiennent à la fois une balise d'ouverture et une balise de fermeture, le contenu entre ces balises est transmis en tant que support spécial: props.children
. Il y a plusieurs façons différentes de transmettre les enfants:
Littéraux de chaîne
Vous pouvez mettre une chaîne entre les balises d'ouverture et de fermeture et props.children
sera simplement cette chaîne. Ceci est utile pour la plupart des éléments HTML intégrés. Par exemple:
<MyComponent>
<h1>Hello world!</h1>
</MyComponent>
Ceci est valide JSX, et props.children
dans MyComponent sera simplement <h1>Hello world!</h1>
.
Notez que le HTML n'est pas échappé , vous pouvez donc généralement écrire JSX comme si vous écriviez du HTML.
N'oubliez pas que dans ce cas, JSX:
- supprime les espaces au début et à la fin d'une ligne;
- supprime les lignes vierges;
- les nouvelles lignes adjacentes aux étiquettes sont supprimées;
- les nouvelles lignes qui apparaissent au milieu des littéraux de chaîne sont condensées dans un seul espace.
JSX Enfants
Vous pouvez fournir plus d'éléments JSX que les enfants. Ceci est utile pour afficher les composants imbriqués:
<MyContainer>
<MyFirstComponent />
<MySecondComponent />
</MyContainer>
Vous pouvez mélanger différents types d'enfants, vous pouvez donc utiliser des littéraux de chaîne avec des enfants JSX . Ceci est une autre façon dont JSX est comme HTML, de sorte que ce soit à la fois JSX valide et HTML valide:
<div>
<h2>Here is a list</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
</div>
Notez qu'un composant React ne peut pas renvoyer plusieurs éléments React, mais qu'une seule expression JSX peut avoir plusieurs enfants . Donc, si vous voulez qu'un composant rende plusieurs choses, vous pouvez les encapsuler dans un div
comme l'exemple ci-dessus.
Expressions JavaScript
Vous pouvez transmettre toute expression JavaScript en tant qu’enfant, en la plaçant dans {}
. Par exemple, ces expressions sont équivalentes:
<MyComponent>foo</MyComponent>
<MyComponent>{'foo'}</MyComponent>
Ceci est souvent utile pour rendre une liste d'expressions JSX de longueur arbitraire. Par exemple, cela affiche une liste HTML:
const Item = ({ message }) => (
<li>{ message }</li>
);
const TodoList = () => {
const todos = ['finish doc', 'submit review', 'wait stackoverflow review'];
return (
<ul>
{ todos.map(message => (<Item key={message} message={message} />)) }
</ul>
);
};
Notez que les expressions JavaScript peuvent être mélangées avec d'autres types d'enfants.
Fonctionne comme des enfants
Normalement, les expressions JavaScript insérées dans JSX seront évaluées par une chaîne, un élément React ou une liste de ces éléments. Cependant, props.children
fonctionne comme n'importe quel autre accessoire en ce sens qu'il peut transmettre n'importe quelle sorte de données, pas seulement celles que React sait rendre. Par exemple, si vous avez un composant personnalisé, vous pouvez le demander en tant que props.children
:
const ListOfTenThings = () => (
<Repeat numTimes={10}>
{(index) => <div key={index}>This is item {index} in the list</div>}
</Repeat>
);
// Calls the children callback numTimes to produce a repeated component
const Repeat = ({ numTimes, children }) => {
let items = [];
for (let i = 0; i < numTimes; i++) {
items.push(children(i));
}
return <div>{items}</div>;
};
Les enfants passés à un composant personnalisé peuvent être n'importe quoi, tant que ce composant les transforme en quelque chose que React peut comprendre avant le rendu. Cet usage n'est pas courant, mais cela fonctionne si vous voulez étirer ce que JSX est capable de faire.
Valeurs ignorées
Notez que false
, null
, undefined
et true
sont des enfants valides. Mais ils ne rendent tout simplement pas. Ces expressions JSX rendront toutes la même chose:
<MyComponent />
<MyComponent></MyComponent>
<MyComponent>{false}</MyComponent>
<MyComponent>{null}</MyComponent>
<MyComponent>{true}</MyComponent>
Ceci est extrêmement utile pour rendre conditionnellement des éléments React. Ce JSX ne rend qu'un si showHeader
est vrai:
<div>
{showHeader && <Header />}
<Content />
</div>
Une mise en garde importante est que certaines valeurs "fausses", telles que le nombre 0
, sont toujours rendues par React. Par exemple, ce code ne se comportera pas comme prévu, car 0
sera imprimé lorsque props.messages
est un tableau vide:
<div>
{props.messages.length &&
<MessageList messages={props.messages} />
}
</div>
Une approche pour résoudre ce problème consiste à s'assurer que l'expression avant le &&
est toujours booléenne:
<div>
{props.messages.length > 0 &&
<MessageList messages={props.messages} />
}
</div>
Enfin, gardez à l'esprit que si vous voulez qu'une valeur comme false
, true
, null
ou undefined
apparaisse dans la sortie, vous devez d'abord la convertir en chaîne:
<div>
My JavaScript variable is {String(myVariable)}.
</div>