Grocery.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import React, { useState } from 'react';
  2. // la modification des éléments de la liste n'est pas gérée ici
  3. // à vous de le faire..
  4. // la sauvegarde des données en localStorage n'est pas faite ici non plus..
  5. // Item
  6. // ====
  7. const Item = ({item}) => <>
  8. <p>Name: {item.name}</p>
  9. <p>Cost: {item.cost}€</p>
  10. <p>Quantity: {item.quantity}</p>
  11. </>;
  12. // ItemsList
  13. // =========
  14. const ItemsList = ({items, updateItem, removeItem}) => <ul>
  15. { items.map((item, idx) => (
  16. <li key={idx}>
  17. <Item item={item} updateItem={(changes) => updateItem(idx, changes)} />
  18. <button onClick={() => removeItem(idx)}> Remove </button>
  19. </li>
  20. )) }
  21. </ul>;
  22. // AddItemForm
  23. // ===========
  24. const AddItemForm = ({addItem}) => {
  25. const [currentText, setCurrentText] = useState('');
  26. const handleSubmit = (e) => {
  27. e.preventDefault();
  28. addItem(currentText);
  29. setCurrentText('');
  30. };
  31. return (
  32. <form onSubmit={handleSubmit}>
  33. <input
  34. type="text"
  35. value={currentText}
  36. onChange={e => setCurrentText(e.target.value)}
  37. />
  38. <button>Add</button>
  39. </form>
  40. );
  41. };
  42. // GroceryApp
  43. // ===========
  44. const GroceryApp = () => {
  45. const [items, setItems] = useState([]);
  46. const addItem = (text) => {
  47. setItems(items => [
  48. {name: text, cost: 1, quantity: 1},
  49. ...items
  50. ]);
  51. };
  52. const removeItem = (index) => {
  53. setItems(items => items.filter((i, idx) => idx !== index));
  54. };
  55. return <>
  56. <h1>Grocery list</h1>
  57. <AddItemForm addItem={addItem} />
  58. <ItemsList
  59. items={items}
  60. removeItem={removeItem}
  61. />
  62. <h3>Total cost : { items.reduce((acc, i) => acc + i.cost * i.quantity, 0) }</h3>
  63. </>;
  64. };
  65. export default GroceryApp;