CodeBlanks Logo Icon CodeBlanks

Modal ile ekleme

Portal ve Suspense ile bir ekleme modalı yazarsın.

Proje sonucu

Bu projede bir panel kurduk: layout ve rota iskeleti, istatistik widget'ı ve modal ile ekleme. Her parça bir derste eklendi ve bir önceki dersin çözümü sonrakinin başlangıç kodu oldu.

React Router ile iç içe rotaları, <Outlet> ile çocuk rotaları, StatCard ile widget'ları ve AddStatModal ile form eklemeyi öğrendin.

Proje sonunda parçalı, gerçek bir uygulama iskeletin var. Bir sonraki seviyede bu yapıyı context ve veri çekme ile büyüteceğiz.

Son adım: birleştir

Şimdi tüm parçaları tek bir dosyada birleştireceksin. StatCard ve AddStatModal tanımlarını, StatsPage ve DashboardLayout bileşenlerini birlikte yazacaksın.

StatsPage iki state tutar: stats dizisi ve isOpen boolean. Ekle düğmesi modal'ı açar; modal'ın onAdd'i yeni bir StatCard ekler.

Bu yapı, gerçek projelerde sık görülür: küçük parçalar ayrı bileşenler, ana sayfa bunları birleştirir.

Uygulama Dashboard final

Tüm parçaları birleştir: StatCard, AddStatModal, StatsPage ve DashboardLayout bileşenlerini yaz. StatsPage içinde useState ile stats dizisi ve isOpen tut; "Ekle" düğmesi setIsOpen(true) yapsın. AddStatModal'dan gelen onAdd, yeni bir StatCard eklesin. DashboardApp BrowserRouter ile /stats rotasında StatsPage göstersin. export default DashboardApp.

Başlangıç kodu

App.jsx
import { useState, useRef } from "react";
import { BrowserRouter, Routes, Route, NavLink, Outlet } from "react-router-dom";

// StatCard, AddStatModal, StatsPage, DashboardLayout, DashboardApp buraya yaz

Örnek çözüm

App.jsx
import { useState, useRef } from "react";
import { BrowserRouter, Routes, Route, NavLink, Outlet } from "react-router-dom";

function StatCard({ label, value }) {
  return (
    <article>
      <h3>{label}</h3>
      <p>{value}</p>
    </article>
  );
}

function AddStatModal({ isOpen, onAdd, onClose }) {
  const inputRef = useRef(null);
  if (!isOpen) return null;
  function handleSubmit(e) {
    e.preventDefault();
    onAdd(inputRef.current.value);
    onClose();
  }
  return (
    <div>
      <form onSubmit={handleSubmit}>
        <input ref={inputRef} />
        <button type="submit">Ekle</button>
      </form>
    </div>
  );
}

function StatsPage() {
  const [stats, setStats] = useState([{ label: "Kullanıcı", value: 120 }]);
  const [isOpen, setIsOpen] = useState(false);
  return (
    <section>
      {stats.map((s, i) => (
        <StatCard key={i} label={s.label} value={s.value} />
      ))}
      <button onClick={() => setIsOpen(true)}>Ekle</button>
      <AddStatModal
        isOpen={isOpen}
        onAdd={(v) => setStats([...stats, { label: v, value: 0 }])}
        onClose={() => setIsOpen(false)}
      />
    </section>
  );
}

function DashboardLayout() {
  return (
    <>
      <nav><NavLink to="/stats">İstatistik</NavLink></nav>
      <main><Outlet /></main>
    </>
  );
}

function DashboardApp() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<DashboardLayout />}>
          <Route path="stats" element={<StatsPage />} />
        </Route>
      </Routes>
    </BrowserRouter>
  );
}

export default DashboardApp;

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bu projede öğrendiklerinden değil?

  • useTransition Doğru cevap
  • Modal ile ekleme
  • StatCard bileşeni
  • İç içe rota

Açıklama: useTransition bu projede işlenmedi.

2 Modal'ı kapat

Soru
function handleClose() {
  setIsOpen(____);
}
Cevap
function handleClose() {
  setIsOpen(false);
}

Açıklama: isOpen false yapılınca modal kapanır.

3 Modal ile ekleme: kavramları eşleştir

Kavram Anlamı
BrowserRouter Router kabuğu
Outlet Çocuk yuvası
NavLink Menü bağlantısı
StatCard Veri kartı

Orta seviye bölümündeki tüm dersler