ያለፉ ሁሉም React ትምህርቶች አብሮ! Components + Props + useState + useEffect + Lists + Conditional 🔥
Combine everything — build a complete React Todo App from scratch!
React ተጠቅሞ ሙሉ Todo App ከዜሮ! Add, Toggle, Delete, Filter, Priority, Progress bar ሁሉም አብሮ!
A complete React Todo App with all features — from scratch!
App → TodoHeader + TodoList + TodoItem components
const [tasks, setTasks] = useState([]) — ሁሉም tasks ይቀመጣሉ
3 ዋና functions — task ማስተዳደሪያ
Filter all/active/done + save to browser
// ── App.jsx — ዋና Component ────────────────────── import { useState, useEffect } from 'react'; function App() { const [tasks, setTasks] = useState([]); const [input, setInput] = useState(''); const [filter, setFilter] = useState('all'); const [priority, setPriority] = useState('medium'); return ( <div className="app"> <TodoHeader input={input} setInput={setInput} onAdd={addTask} priority={priority} setPriority={setPriority} /> <TodoList tasks={filteredTasks} onToggle={toggleTask} onDelete={deleteTask} filter={filter} setFilter={setFilter} /> </div> ); }
// ── addTask ───────────────────────────────────── function addTask() { if (!input.trim()) return; // ባዶ ከሆነ ቁም setTasks([...tasks, { id: Date.now(), text: input.trim(), done: false, priority: priority, }]); setInput(''); // input አጽዳ } // ── toggleTask ────────────────────────────────── function toggleTask(id) { setTasks(tasks.map(t => t.id === id ? { ...t, done: !t.done } : t )); } // ── deleteTask ────────────────────────────────── function deleteTask(id) { setTasks(tasks.filter(t => t.id !== id)); } // ── filter ────────────────────────────────────── const filteredTasks = tasks.filter(t => { if (filter === 'active') return !t.done; if (filter === 'done') return t.done; return true; // 'all' });
localStorage — Browser ውስጥ ውሂብ ለማስቀመጥ! Page ሲዘጋ ቢሆንም tasks ይቀራሉ!
localStorage saves data in the browser — tasks persist even after page reload!
// ── Load — App ሲጫን tasks ጫን ────────────────── useEffect(() => { const saved = localStorage.getItem('tasks'); if (saved) setTasks(JSON.parse(saved)); }, []); // [] = አንድ ጊዜ ብቻ (on mount) // ── Save — tasks ሲቀየር ሁሌ save ────────────────── useEffect(() => { localStorage.setItem('tasks', JSON.stringify(tasks)); }, [tasks]); // tasks ሲቀየር ብቻ ይሰራ // ── TodoItem Component ────────────────────────── function TodoItem({ task, onToggle, onDelete }) { return ( <li key={task.id} className={task.done ? 'done' : ''}> <button onClick={() => onToggle(task.id)}> {task.done ? '✅' : '⬜'} </button> <span>{task.text}</span> <span className={`pri-${task.priority}`}> {task.priority} </span> <button onClick={() => onDelete(task.id)}> 🗑️ </button> </li> ); }
ሁሉም ያለፉ ትምህርቶች አብሮ ቆሟል! Add, toggle, delete, filter, priority, progress — ሙሉ ነው! 🔥
This combines: Components + Props + useState + useEffect + .map() + Conditional!
const [tasks, setTasks] = useState([]) — add, toggle, delete, filter
Page ሲዘጋ ቢሆን tasks ይቀራሉ! JSON.stringify / parse
tasks.map(t => <TodoItem key={t.id} ... />)
t.done ? '✅' : '⬜' | filter === 'done' ? tasks.filter(t => t.done) : tasks
TodoItem ን Props ተጠቅሞ ተለያይቶ ሰራ — reusable!