Composants
Une application React est constituée de composants imbriqués. Séparer une application en composant permet de découper le code par rôle (single responsibility) et factoriser des zones réutilisables.
JSX
En React, un composant est une fonction. Pour décrire le rendu d'un composant, on utilise la syntaxe JSX, qui ressemble à du HTML mais est en réalité une extension de JavaScript.
https://react.dev/learn/your-first-component
Un composant peut être imbriqué dans un autre composant, et ainsi de suite.
Pour afficher des données dans un composant (interpolation), on utilise les accolades {}.
function App() {
return (
<div>
<Counter />
</div>
)
}
function Counter() {
const count = 10;
return <div>Count is {count}</div>
}Lifecycle
Une fonction de composant est appelée à chaque fois que le composant est rendu. React décide de quand ce rendu est déclenché, généralement par un changement d'état ou une modification de props.
Cela signifie que l'état des variables locales est perdu à chaque rendu, on va donc en general utiliser des constantes.
function Counter() {
let count = 10;
count++; // la valeur sera remise à 10 à chaque rendu
return <div>Count is {count}</div>
}https://react.dev/learn/keeping-components-pure
Props
Pour passer des données à un composant, on utilise les props. Les props sont passées en argument à la fonction du composant.
function App() {
const name = "John";
return <Hello name={name} />
}
function Hello({ name }) {
return <div>Hello {name}</div>
}https://react.dev/learn/passing-props-to-a-component
Différence notables entre HTML et JSX
class->classNamefor->htmlFortabindex->tabIndexkey: identifiant unique pour les éléments du rendu en listeref: référence à un élément du DOMonClick: gestionnaire d'événement de cliconChange: gestionnaire d'événement de changement- ...
Interpolation avancée
Dans le JSX, le code placé entre accolades est interprété comme du JavaScript, il est donc possible d'utiliser des expressions complexes.
function App() {
const name = "John";
const data = [0, 1, 2]
return (
<div>
{/* Interpolation simple */}
<p>{`Hello ${name}`}</p>
<p>{1+1}</p>
{/* Conditionnel */}
{data[0] > 0 && <p>data[0] is greater than 0</p>}
{/* Conditionnel ternaire */}
<p>{Math.random() > 0.5 ? "Hello" : "World"}</p>
{/* Rendu d'une liste */}
<p>{data.map((item) => <span key={item}>{item}</span>)}</p>
</div>
)
}Le rendu sera:
<div>
<p>Hello John</p>
<p>2</p>
<p>World</p>
<p><span>0</span><span>1</span><span>2</span></p>
</div>Evenements
Les événements sont des actions effectuées par l'utilisateur ou le navigateur, qui déclencheront des fonctions.
function App() {
function handleClick() {
alert("Hello")
}
function handleChange(event) {
console.log(event.target.value)
}
return (
<div>
<input type="text" onChange={handleChange} />
<button onClick={handleClick}>Click me</button>
</div>
)
}Fragments
Il est parfois necessaire de retourner plusieurs éléments d'un composant, sans pour autant les placer dans une balise HTML commune. Pour cela, on peut utiliser un fragment.
function App() {
return (
// equivalent à <Fragment>
<>
<p>Hello</p>
<p>World</p>
</>
)
}Typescript
Il est vivement recommandé d'utiliser TypeScript pour tous les projets Javascript, nottament avec React. Les composants seront alors écrits en TSX.
Exemple de composant correctement typé:
interface ButtonProps {
label: string;
onClick?: () => void;
}
const Button: React.FC<ButtonProps> = ({ label, onClick }) => {
return (
<button
onClick={onClick}
>
{label}
</button>
);
};
export default Button;