ReactJS_06_duzy_przyklad_lista_produktow.md

#06duzyprzykladlistaproduktow

Opis Jeden większy przykład z Reacta: formularz, dodawanie, mapowanie, filtrowanie i walidacja.

REACTimport { useState } from "react";

function App() {
  const [produkty, setProdukty] = useState([
    { id: 1, nazwa: "Myszka", cena: 50 },
    { id: 2, nazwa: "Klawiatura", cena: 120 },
    { id: 3, nazwa: "Monitor", cena: 700 }
  ]);

  const [nazwa, setNazwa] = useState("");
  const [cena, setCena] = useState("");
  const [szukaj, setSzukaj] = useState("");
  const [blad, setBlad] = useState("");

  function dodajProdukt(e) {
    e.preventDefault();

    if (nazwa.length < 2) {
      setBlad("Nazwa musi mieć minimum 2 znaki");
      return;
    }

    if (Number(cena) <= 0) {
      setBlad("Cena musi być większa od 0");
      return;
    }

    const nowyProdukt = {
      id: Date.now(),
      nazwa: nazwa,
      cena: Number(cena)
    };

    setProdukty([...produkty, nowyProdukt]);
    setNazwa("");
    setCena("");
    setBlad("");
  }

  const wynik = produkty.filter((produkt) =>
    produkt.nazwa.toLowerCase().includes(szukaj.toLowerCase())
  );

  return (
    <div>
      <h1>Lista produktów</h1>

      <form onSubmit={dodajProdukt}>
        <input
          placeholder="Nazwa produktu"
          value={nazwa}
          onChange={(e) => setNazwa(e.target.value)}
        />

        <input
          type="number"
          placeholder="Cena"
          value={cena}
          onChange={(e) => setCena(e.target.value)}
        />

        <button type="submit">Dodaj</button>
      </form>

      {blad && <p style={{ color: "red" }}>{blad}</p>}

      <hr />

      <input
        placeholder="Szukaj produktu"
        value={szukaj}
        onChange={(e) => setSzukaj(e.target.value)}
      />

      {wynik.map((produkt) => (
        <div key={produkt.id}>
          <b>{produkt.nazwa}</b> - {produkt.cena} zł
        </div>
      ))}
    </div>
  );
}

export default App;