Ceci est une ancienne révision du document !
React
Installation
NodeJS requis
Standalone project
Création du projet :
npx create-react-app my-app |
Eventuellement avec le support typeScript :
npx create-react-app my-app --template typescript |
Démarrage du serveur
cd my-app npx start |
Composants
En React, tout est composant, et les composants peuvent être créés à partir de fonctions (JS), ou de classes (ES6 ou TypeScript).
Fonctions
Un composant peut être créé à partir d'une fonction :
1 2 3 4 5 6 7 8 9 |
function Hello() { return ( <div> <h1>props.message</h1> </div> ); } export default Hello; |
Classe
Un composant peut être créé à partir d'une classe ES6 :
1 2 3 4 5 6 7 8 |
import React from "react" ; class Hello extends React.Component { render() { return <h1>{ this .props.message}</h1>; } } export default Hello; |
Classe TypeScript
Un composant peut être créé à partir d'une classe TypeScript:
1 2 3 4 5 6 7 8 9 |
import React from "react" ; export default class Hello extends React.Component<{message: string}> { render() { return ( <h1>{ this .props.message}</h1> ); } } |
La classe Hello déclare explicitement une propriété de nom message de type string.
Utilisation
Utilisation de Hello dans l'App, et initialisation en JSX de la prop message avec l'attribut message :
1 2 3 4 5 6 7 8 9 10 11 |
import Hello from './hello' ; function App() { return ( <div className= "App" > <Hello message= "Hello World!" /> </div> ); } export default App; |
Props et state
Sur un composant React :
- Les propriétés sont accessibles avec l'objet props passé en paramètre (du constructeur ou de la fonction)
- Ces propriétés sont initialisées en JSX/HTML via les attributs de l'élément.
- Elles sont immutables (en lecture seule).
- Il est nécessaire d'utiliser l'objet state pour modifier l'état d'un composant.
Exemple classe TypeScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import React from "react" ; export default class Hello extends React.Component<{message:string},{msg: string}> { constructor(props: {message:string}) { super (props); this .state = {msg: props.message}; } handleChange = (event: React.ChangeEvent<HTMLInputElement>) => { this .setState({msg: event.target.value}) } render() { return ( <> <h1>{ this .state.msg}</h1> <input value={ this .state.msg} onChange={ this .handleChange}/> < /> ); } } |
Exemple fonction JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import {useState} from "react" ; export default function Hola(props){ const [message, setMessage] = useState(props.message); const handleChange = (e) => { setMessage(e.target.value); } return ( <> <h1>{message}</h1> <input type= "text" value={message} onChange={handleChange}/> < /> ); } |
Http Wrapper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// This is a wrapper for the fetch API export default class AppHttp { static async get(url, options) { const response = await fetch(url, options); return await response.json(); } static async post(url, body, options) { const response = await fetch(url, { method: 'POST' , body: JSON.stringify(body), ...options }); return await response.json(); } static async put(url, body, options) { const response = await fetch(url, { method: 'PUT' , body: JSON.stringify(body), ...options }); return await response.json(); } static async delete (url, options) { const response = await fetch(url, { method: 'DELETE' , ...options }); return await response.json(); } } |
Contexte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
'use client' ; import React, {createContext, ReactNode, useContext, useState} from 'react' ; interface DemoContextType { data: number ; setData: (d: number )=>void; } const DemoContext = createContext<demoContextType | undefined>(undefined); export const demoProvider: React.FC<{ children: ReactNode }> = ({children}) => { const [data, setData] = useState< number >(0); return ( <DemoContext.Provider value={{data, setData}}> {children} </DemoContext.Provider> ); }; export const useDemo = (): DemoContextType => { const context = useContext(demoContext); if (!context) { throw new Error( 'usedemo must be used within a DemoProvider' ); } return context; }; |