roadmap.az

Menyu

Portfolio layihələri

Kiçik, amma tamamlanmış layihə

Kitab izləyicisinin ilk versiyasını üç əməliyyatla məhdudlaşdır: əlavə et, statusunu dəyiş, sil. Sonra axtarış və yaddaş əlavə et. Hər funksiyanın işlədiyini yoxlamadan yenisinə keçmə.

README-də problemin nə olduğunu, lokal işə salma əmrlərini, verdiyin əsas qərarları və qalan məhdudiyyətləri yaz. Ekran görüntüsü ilə yanaşı işlək demo və mənbə koduna keçid ver.

Növbəti layihə üçün xərclər izləyicisi və ya açıq məlumatdan istifadə edən kataloq seçə bilərsən. Məqsəd eyni təlimatı təkrarlamaq deyil, tələbləri özün bölmək və qərarlarını izah etməkdir.

Əlavə qeydlər və mənbələr

Öyrəndiklərini həll etdiyin real bir problem ətrafında birləşdir.

Niyə vacibdir?

Portfolio qərarlarını, problem həll etmə bacarığını və işlək nəticəni göstərir.

Əvvəlki biliklər

Bu mövzuda

  • Kiçik layihə üçün tələbləri yaz
  • Responsiv və əlçatan interfeys qur
  • Məlumat, xəta və boş vəziyyətləri tamamla
  • README-də qərarlarını və məhdudiyyətləri izah et

Mənbələr

Məşqin idarəetməsi
Addım 1 / 2

Layihəni izah edə bilən hala gətir

Problemi seç, işi hazırla və yoxlanıla bilən nəticəni paylaş.

Prosesi son vəziyyətə çatdır.

  1. Problem
  2. Həll
  3. Yoxlama
  4. Paylaşım
Problem

Kimin hansı işini asanlaşdırırsan?

İstifadəçi ehtiyacı

Bu məşq prosesi modelləşdirir.

Özün sına

Kitab izləyicisi hazırla: kitab əlavə et, oxunma statusunu dəyiş, axtar və məlumatı localStorage-da saxla. Layihəni yayımla.

Nəticəni necə yoxlayım?

İşlək demo, mənbə kodu və README var; yeniləmədən sonra məlumat qalır və əsas funksiyalar test olunub.

Gözlənilən nəticə

  • Kitab əlavə edilir, oxunma statusu dəyişir, axtarış nəticəni daraldır.
  • Brauzeri yeniləyəndə saxlanan kitablar qayıdır. Yaddaş bağlıdırsa xəbərdarlıq görünür. Layihəni deployment dərsinin yoxlama siyahısı ilə yayımla.
Görünüş nümunəsi

Bu, görünüş nümunəsidir. İnteraktiv davranışı kodu öz layihəndə işlədərək yoxla.

Nümunə həllə bax

Əvvəl özün sına, sonra müqayisə et. Bu, mümkün həllərdən biridir.

Kitablar unikal ID ilə saxlanır, vəziyyət yalnız yeni massiv/obyektlə yenilənir. localStorage işləməyəndə səhifə istifadəyə davam edir və xəbərdarlıq verir.

App.jsx

import { useEffect, useState } from 'react';
const key = 'book-tracker:v1';
function loadBooks() {
  try {
    const data = JSON.parse(localStorage.getItem(key) ?? '[]');
    return Array.isArray(data) ? data.filter(book => book && typeof book.id === 'string' && typeof book.title === 'string' && typeof book.read === 'boolean') : [];
  } catch { return []; }
}
export default function App() {
  const [books, setBooks] = useState(loadBooks);
  const [title, setTitle] = useState('');
  const [query, setQuery] = useState('');
  const [warning, setWarning] = useState('');
  useEffect(() => {
    try { localStorage.setItem(key, JSON.stringify(books)); setWarning(''); }
    catch { setWarning('Yaddaş əlçatan deyil; dəyişikliklər yalnız bu səhifədə qalır.'); }
  }, [books]);
  function add(event) {
    event.preventDefault(); if (!title.trim()) return;
    const book = { id: crypto.randomUUID(), title: title.trim(), read: false };
    setBooks(previous => [...previous, book]); setTitle('');
  }
  const visible = books.filter(book => book.title.toLocaleLowerCase('az').includes(query.toLocaleLowerCase('az')));
  return <main><h1>Kitab izləyicisi</h1><form onSubmit={add}><label>Kitab adı<input value={title} onChange={event => setTitle(event.target.value)} /></label><button>Əlavə et</button></form>
    <label>Axtar<input value={query} onChange={event => setQuery(event.target.value)} /></label>
    {warning && <p role="status">{warning}</p>}
    {visible.length ? <ul>{visible.map(book => <li key={book.id}><label><input type="checkbox" checked={book.read} onChange={() => setBooks(previous => previous.map(item => item.id === book.id ? { ...item, read: !item.read } : item))} />{book.title}</label></li>)}</ul> : <p>Kitab tapılmadı.</p>}
  </main>;
}

Praktikanı bitirdin?Özün qiymətləndirirsən. İrəliləyiş bu brauzerdə saxlanılır.