Items.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import React, { useState } from 'react';
  2. // ItemsList
  3. // =========
  4. const ItemsList = ({items, removeItem}) => (
  5. <ul>
  6. { items.map((item, idx) => (
  7. <li key={idx}>
  8. {item}
  9. <button onClick={() => removeItem(idx)}> Remove </button>
  10. </li>
  11. )) }
  12. </ul>
  13. );
  14. // AddItemForm
  15. // ===========
  16. const AddItemForm = ({addItem}) => {
  17. const [currentText, setCurrentText] = useState('');
  18. const handleSubmit = (e) => {
  19. e.preventDefault();
  20. addItem(currentText);
  21. setCurrentText('');
  22. };
  23. return (
  24. <form onSubmit={handleSubmit}>
  25. <input
  26. type="text"
  27. value={currentText}
  28. onChange={e => setCurrentText(e.target.value)}
  29. />
  30. <button>Add</button>
  31. </form>
  32. );
  33. };
  34. // ItemsApp
  35. // ========
  36. const ItemsApp = () => {
  37. const [items, setItems] = useState([]);
  38. const addItem = (text) => {
  39. setItems(items => [text, ...items].sort((a, b) => a.localeCompare(b)));
  40. };
  41. const removeItem = (index) => {
  42. setItems(items => items.filter((i, idx) => idx !== index));
  43. };
  44. return <>
  45. <AddItemForm addItem={addItem} />
  46. <ItemsList
  47. items={items}
  48. removeItem={removeItem}
  49. />
  50. </>;
  51. };
  52. export default ItemsApp;