React est une librairie JavaScript pour créer des interfaces Web. Documentation officielle
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"
]
}
}
Extensions intéressantes:
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</>
</>
);
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>
);
}
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
Les composants construits en classe doivent toujours appeler le constructeur de base avec les props (eg. super(props);).
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);
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.
Utilisation de base:
const [state, setState] = useState(initialState); setState(newState);
useEffect(() => { // Équivalent à componentDidMount window.addEventListener('unhandledRejection', handler); return () => { // Équivalent à componentWillUnmount window.removeEventListener('unhandledRejection', handler); } }, [])
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} /> ); };