Table des matières
React avec TypeScript
React est une librairie JavaScript pour créer des interfaces Web. Documentation officielle
Librairies
Avantages
- Rapidité (60 fps, render < 16 ms)
- Déclaratif
- Composable
Démarrer
On peut utiliser create-react-app
pour commencer un projet React.
Pour un projet en TypeScript:
$ npx create-react-app my-react-ts-app --typescript
Ce qui va créer un répertoire my-react-ts-app
.
Pour utiliser SCSS, ajouter ces dépendances:
$ npm i -D node-sass $ npm i -D @types/node-sass
On peut démarrer le projet avec:
$ npm start
Le projet contient des fichiers TSX.
Pour le linting:
$ npm install tslint tslint-react tslint-config-prettier --save-dev
Fichier tslint.json
recommendé, on peut personnaliser:
{ "extends": ["tslint:recommended", "tslint-react", "tslint-config-prettier"], "rules": { "interface-name": false, "ordered-imports": true, "object-literal-sort-keys": false, "prefer-const": [true, {"destructuring": "any"}], "no-debugger": false, "no-console": false, "no-trailing-whitespace": [true, "always"], "semicolon": [true, "always"], "whitespace": [true, "check-branch", "check-operator", "check-typecast", "check-module"] }, "linterOptions": { "exclude": [ "config/**/*.js", "node_modules/**/*.ts", "coverage/lcov-report/*.js" ] } }
React avec Visual Studio Code
Extensions intéressantes:
- Simple React Snippets
Fragment
On ne peut retourner qu'un node (DOM) à la fois dans une fonction, alors, on ne peut pas faire:
const HomePage = () => ( <h1>Titre</h1> <p>Texte</> );
Il faudrait plutôt faire:
const HomePage = () => ( <div> <h1>Titre</h1> <p>Texte</> </div> );
Mais ceci fait en sorte que le rendu final aura des éléments <div>
supplémentaires pour rien.
On peut alors utiliser React.Fragement
:
const HomePage = () => ( <React.Fragment> <h1>Titre</h1> <p>Texte</> </React.Fragment> );
ou utiliser le raccourcis:
const HomePage = () => ( <> <h1>Titre</h1> <p>Texte</> </> );
Router
Installation:
$ npm install --save react-router-dom $ npm install --save-dev @types/react-router-dom
Exemple d'utilisation:
const App: React.FC = () => { return ( <Router> <div className="App"> <Route path="/" component={HomePage} exact /> </div> </Router> ); }
Redux
Pour installer Redux:
$ npm install redux
Ce dernier contient les types
.
Spécifiquement pour React, aussi installer:
$ npm install react-redux $ npm install --save-dev @types/react-redux
Installer aussi :
$ npm install redux-thunk $ npm install --save-dev @types/redux-thunk
Élements
Components
Function Components
Stateful Function Components
Class Components
Les composants construits en classe doivent toujours appeler le constructeur de base avec les props
(eg. super(props);
).
Higher Order Component
Méthodes du cycle de vie d'un composant
Fetch data
const result = await fetch(`/api/articles/${articleName}/add-comment`, { method: 'post', body: JSON.stringify({ username, text: commentText }), headers: { 'Content-Type': 'application/json', }, }); const body = await result.json(); setArticleInfo(body);
Gestion des erreurs
Hooks
Les hooks permet de ne pas avoir besoin de créer des composants de classes, ces derniers ayant pour désavantage de complexifier le code.
useState
Utilisation de base:
const [state, setState] = useState(initialState); setState(newState);
useEffect
useEffect(() => { // Équivalent à componentDidMount window.addEventListener('unhandledRejection', handler); return () => { // Équivalent à componentWillUnmount window.removeEventListener('unhandledRejection', handler); } }, [])
useRef
import React, { useRef } from 'react'; const ImageToggle = ({ primaryImg, secondaryImg }) => { const imageRef = useRef(null); return ( <img onMouseOver={() => imageRef.current.src = secondaryImg} onMouseOut={() => imageRef.current.src = primaryImg} src={primaryImg} alt="" ref={imageRef} /> ); };