Grocery.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. // Item
  5. // ====
  6. const Item = ({item}) => <>
  7. <p>Name: {item.name}</p>
  8. <p>Cost: {item.cost}€</p>
  9. <p>Quantity: {item.quantity}</p>
  10. </>;
  11. // ItemsList
  12. // =========
  13. const ItemsList = ({items, updateItem, removeItem}) => <ul>
  14. { items.map((item, idx) => (
  15. <li key={idx}>
  16. <Item item={item} updateItem={(changes) => updateItem(idx, changes)} />
  17. <button onClick={() => removeItem(idx)}> Remove </button>
  18. </li>
  19. )) }
  20. </ul>;
  21. // AddItemForm
  22. // ===========
  23. const AddItemForm = ({addItem}) => {
  24. const [currentText, setCurrentText] = useState('');
  25. const handleSubmit = (e) => {
  26. e.preventDefault();
  27. addItem(currentText);
  28. setCurrentText('');
  29. };
  30. return (
  31. <form onSubmit={handleSubmit}>
  32. <input
  33. type="text"
  34. value={currentText}
  35. onChange={e => setCurrentText(e.target.value)}
  36. />
  37. <button>Add</button>
  38. </form>
  39. );
  40. };
  41. // GroceryApp
  42. // ===========
  43. const GroceryApp = () => {
  44. const [items, setItems] = useState([]);
  45. const addItem = (text) => {
  46. setItems(items => [
  47. {name: text, cost: 1, quantity: 1},
  48. ...items
  49. ]);
  50. };
  51. const removeItem = (index) => {
  52. setItems(items => items.filter((i, idx) => idx !== index));
  53. };
  54. return <>
  55. <h1>Grocery list</h1>
  56. <AddItemForm addItem={addItem} />
  57. <ItemsList
  58. items={items}
  59. removeItem={removeItem}
  60. />
  61. <h3>Total cost : { items.reduce((acc, i) => acc + i.cost * i.quantity, 0) }</h3>
  62. </>;
  63. };
  64. export default GroceryApp;