Philosophie
Introduction
- Dev par Facebook en 2013
- JSX (aujourd'hui TSX)
- Approche composant avec une gestion du cycle de vie et des Γ©tats locaux (states)
Version notables
16.0
(2017) ->Fragments
, changement dans le cycle de vie, Server Side Rendering16.3
(2018) ->Context API
16.8
(2019) ->Hooks
18
(2022) ->Concurrent
management
Architecture
βββββββββββββββββββββ
β β
β React Component β
Props βββββββββββΊ β β βββββββββββΊ render
β - State β
β β
βββββββββββββββββββββ
Props
- C'est rΓ©cupΓ©rΓ© depuis le composant qui instancie. C'est une ressource immutable :
class Cat extends React.Component {
render() {
return <h1>{this.props.name} section</h1>;
}
}
class App extends React.Component {
render() {
return (
<div>
<Cat name=βJimβ />
</div>
);
}
}
States
- C'est limitΓ© au composant, modifiable et asynchrone:
class Cat extends React.Component {
constructor(props) {
super(props);
this.state = {
name: βJimβ
};
}
render() {
return <div>{ this.state.name }</div>;
}
}
Nouvelle version
- On est passΓ© d'une approche
Class component
Γ une approcheFunctional component
:
class Cat extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
devient
function Cat(props) {
return <h1>Hello, {props.name}</h1>;
}
Cycle de Vie
βββββββββββββββββββββββββββ ββββββββββββββββββββββββ ββββββββββββββββββββββββββ
β β β β β β
β Mounting β β Updating β β Unmounting β
β β β β β β
β β β β β β β
β Constructor β β β β β β
β β β β β β β
β β β β β β β β
β β β β β β β β
β β β β β β β β
β β β β β β β β
β ββββββΌββββββββββββββββΌβββββΌββββββββββββββ β β β β
β β β β β β β β β
β β render β β β β β β β
β β β β β β β β β
β ββββββββββ¬ββββββββββββΌβββββΌβββββββββ¬βββββ β β β β
β β β β β β β β β
β β β β β β β βΌ β
β βΌ β β βΌ β β β
β β β β β β
β ComponentDidMount β β ComponentDidUpdate β β ComponentDidUnmount β
β β β β β β
β β β β β β
βββββββββββββββββββββββββββ ββββββββββββββββββββββββ ββββββββββββββββββββββββββ
Code
Fragments
- Permet de rendre des composants HTML au mΓͺme niveau sans avoir besoin de "nested":
<>
/* Mon code */
</>
est Γ©quivalent Γ
<Fragment>
/* Mon code */
</Fragment>
Keys
- Penser Γ utiliser les keys dans les composant pour permettre Γ
React
de faire le rendu dans le bon sens.
Get Started
Pour crΓ©er une app React
avec npx
, on utilise Create React App (CRA) :
npx create-react-app front --template typescript
cd front
npm start
Router
- Avec react on peut avoir un router qui manipule l'API
history
du DOM Html. Le package Γ installer est le suivant:react-router-dom@6
Context
Les Context permettent de partager des donnΓ©es en profondeur dans l'arbre sans avoir besoin de passer les Γ©lΓ©ments Γ travers les props
.
Il possède deux éléments clefs:
Provider
qui dΓ©clare et fournit les donnΓ©es du contexte.Consumer
qui conomme et récupère les données du contexte
Redux
- Permet de faire ce que fait les Context avant leur introduction.
- Il possède un état global appelé le Store.
- C'est une _conteneur Γ Γ©tat prΓ©dictible: en fonction des inputs, on peut prΓ©voir l'Γ©tat suivant.
- Les actions sont dΓ©clenchΓ©es par les composants React et modifie l'Γ©tat du Store
- La rΓ©ponse est produite et rΓ©cupΓ©rΓ©e par un reducer qui fabrique un nouvel Γ©tat du store Γ partir de l'Γ©tat prΓ©cΓ©dent et de la rΓ©ponse de l'action.
- Pour l'action, utilisation de fonctions pures : (pas de variations de sorties pour les mΓͺmes arguments + pas d'effets de bord).
- Les selectors permettent d'obtenir le resultat depuis le store.
Test
React Testing Library (RTL)
- Permet d'interagir avec les composants React.
Smoke test
- Permet de vΓ©rifier qu'un composant s'affiche sans crash.
Snapshot test
- VΓ©rifier si le rendu d'un html est bon.
Mock test
- permet de vΓ©rifier que les composants s'affichent comme il le faut.
Formulaire
Uncontrolled vs controlled component
- Les Uncontrolled components sont des composants qui sont gΓ©rΓ©s par le
DOM
html. - Les Controlled components sont des composants dont l'Γ©tat interne est gΓ©rΓ© par React.
Uncontrolled
Pour faire un uncontrolled, on dΓ©finit une rΓ©fΓ©rence que l'on donne en attribut :
// Valeur de input est accessible via nameInputRef.current.value
// Nous devons utiliser defaultValue pour initialiser l'input
function NameFormUncontrolled({defaultValue}: {defaultValue: string}) {
const nameInputRef = useRef<HTMLInputElement>(null);
return (
<div>
<input defaultValue={defaultValue} ref={nameInputRef} placeholder="name" />
</div>
);
Controlled
- On récupère l'état interne via un State :
function NameFormControlled() {
const [name, setName] = useState("");
return (
<div>
<input
onChange={(inputEvent) => setName(inputEvent.target.value)}
defaultValue={name}
/>
</div>
);
}
React Hook Form
Il s'agit d"une bibliotèque permettant de construire un formulaire sans avoir trop de code redondant.
npm install react-hook-form