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->- className
- for->- htmlFor
- tabindex->- tabIndex
- key: identifiant unique pour les éléments du rendu en liste
- ref: référence à un élément du DOM
- onClick: gestionnaire d'événement de clic
- onChange: 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;