App.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import React, { useState, useEffect } from 'react';
  2. import './App.css';
  3. // Ce composant Toggle reçoit une fonction onChange
  4. // qu'il appelle avec son nouvel état à chaque changement.
  5. // Cela permet à son parent d'être prévenu à chaque changement d'état
  6. const Toggle = ({onChange}) => {
  7. const [on, setOn] = useState(false);
  8. const handleChange = () => {
  9. setOn(!on);
  10. onChange(!on);
  11. };
  12. return <div>
  13. <p>Toggle is { on ? 'ON' : 'OFF' }</p>
  14. <button onClick={handleChange}>Change value</button>
  15. </div>;
  16. };
  17. // Ce composant gère et affiche l'état d'un compteur
  18. // Un bouton permet d'incrémenter la valeur
  19. const Counter = () => {
  20. const [count, setCount] = useState(0);
  21. return <div>
  22. <p>Value: {count}</p>
  23. <button onClick={() => setCount(c => c+1)}>Increment</button>
  24. </div>;
  25. };
  26. // Ce custom hook permet à n'importe quel composant
  27. // d'utiliser une horloge qui se met à jour chaque seconde
  28. const useClock = () => {
  29. const [time, setTime] = useState(new Date().toLocaleTimeString());
  30. useEffect(() => {
  31. const id = setInterval(() => {
  32. setTime(new Date().toLocaleTimeString());
  33. }, 1000);
  34. return () => clearInterval(id);
  35. }, []);
  36. return time;
  37. };
  38. // Ce composant gère et affiche une horloge qui se met à jour à chaque seconde
  39. // Un custom hook n'est qu'une simple fonction (comme si on mettait
  40. // le code du custom hook directement dans ce composant)
  41. const Clock = () => {
  42. const time = useClock();
  43. return <p>It is {time}</p>;
  44. };
  45. const App = () => {
  46. const [showClock, setShowClock] = useState(true);
  47. const [nbOn, setNbOn] = useState(0);
  48. return (
  49. <div className="App">
  50. <Toggle onChange={(v) => { if (v) setNbOn(n => n+1) }} />
  51. <p>Nb times toggle on: {nbOn}</p>
  52. <Counter />
  53. <div>
  54. <label>Show clock</label>
  55. <input type="checkbox" checked={showClock} onChange={(e) => setShowClock(e.target.checked)} />
  56. </div>
  57. { showClock && <Clock /> }
  58. </div>
  59. );
  60. };
  61. export default App;