Thuta Learning
ရှာဖွေရန်
ProjectsWeb Developmentintermediate

Project: Task Tracker Polish

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Project: Task Tracker Polish ကို လက်တွေ့ project ထဲမှာ အသုံးချတတ်မယ်
  • ကိုယ်တိုင် code ရေးပြီး run ကြည့်တတ်မယ်
  • Project တစ်ခုလုံးကို အဆင့်လိုက် ဆောက်တတ်မယ်

ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်

နောက်ဆုံး Part မှာ app ကို "toy demo" ကနေ "တကယ်သုံးလို့ရတဲ့ app" ဖြစ်လာအောင် polish လုပ်ပါမယ်။ Browser ကို refresh လုပ်လိုက်ရင်တောင် task data တွေ မပျောက်အောင် useEffect နဲ့ localStorage ထဲ save/load လုပ်ဖို့ လိုပါတယ်။ ဒီ logic ကို component ထဲမှာ တိုက်ရိုက်ရေးမယ့်အစား custom hook (useLocalStorage) တစ်ခုအဖြစ် ထုတ်ခွဲထားရင် code ပိုသန့်ပြီး reusable ဖြစ်ပါတယ်။ ဒီအပြင် "All / Active / Done" filter buttons ထည့်ပြီး၊ task list ကြီးလာရင် unnecessary re-computation မဖြစ်အောင် useMemo နဲ့ filtered list ကို optimize လုပ်ပါမယ်။ ဒီအဆင့်ကို ပြီးရင် Task Tracker project တစ်ခုလုံး ပြီးစီးပါပြီ။

လက်တွေ့ ဆောက်ကြည့်မယ်

src/hooks/useLocalStorage.js ဆိုပြီး custom hook ဆောက်ပါ - useState + useEffect ပေါင်းစပ်ပြီး key/initialValue လက်ခံပြီး value ပြောင်းတိုင်း localStorage.setItem လုပ်ပေးရမယ်။ TaskTracker ထဲက useState(tasks) ကို useLocalStorage("tasks", []) နဲ့ အစားထိုးပါ။ filter state (all/active/done) တစ်ခု ထပ်ထည့်ပြီး filter button သုံးခု render လုပ်ပါ။ useMemo နဲ့ filteredTasks ကို tasks နဲ့ filter ပြောင်းမှသာ ပြန် compute အောင် wrap ထားပါ။ နောက်ဆုံးအနေနဲ့ CSS class name တွေထည့်ပြီး app ကို visual အရ သပ်ရပ်အောင် style ပေးပါ - flex layout, padding, border-radius စသည်ဖြင့်။

Code နမူနာ

javascript
// src/hooks/useLocalStorage.js
import { useState, useEffect } from "react";

function useLocalStorage(key, initialValue) {
  const [value, setValue] = useState(() => {
    const saved = localStorage.getItem(key);
    return saved ? JSON.parse(saved) : initialValue;
  });

  useEffect(() => {
    localStorage.setItem(key, JSON.stringify(value));
  }, [key, value]);

  return [value, setValue];
}

export default useLocalStorage;

// src/components/TaskTracker.jsx (excerpt)
import { useState, useMemo } from "react";
import useLocalStorage from "../hooks/useLocalStorage";

function TaskTracker() {
  const [tasks, setTasks] = useLocalStorage("tasks", []);
  const [filter, setFilter] = useState("all");

  const filteredTasks = useMemo(() => {
    if (filter === "active") return tasks.filter((t) => !t.done);
    if (filter === "done") return tasks.filter((t) => t.done);
    return tasks;
  }, [tasks, filter]);

  return (
    <div className="task-tracker">
      <h2>My Tasks</h2>
      <div className="filters">
        <button onClick={() => setFilter("all")}>All</button>
        <button onClick={() => setFilter("active")}>Active</button>
        <button onClick={() => setFilter("done")}>Done</button>
      </div>
      {/* form + list from Part 2 stays the same, mapped over filteredTasks */}
    </div>
  );
}
You should see
Browser refresh လုပ်တောင် task list မပျောက်တော့ဘဲ၊ filter button တွေနှိပ်တဲ့အခါ Active/Done task များပဲ ချက်ချင်းစီညှိပြသွားပါလိမ့်မယ်။

၅ မိနစ် စမ်းကြည့်

Task count ('3 tasks left' ဆိုသလို) ကို filter bar ဘေးမှာ ထည့်ပြပါ - active task အရေအတွက်ကို useMemo နဲ့ calculate လုပ်ကြည့်ပါ၊ 5 minutes လောက်ပဲ ကြာပါမယ်။

သတိလေးတစ်ချက်

localStorage က string ပဲသိမ်းလို့ရလို့ JSON.stringify/JSON.parse ကို အမြဲတွဲသုံးဖို့ လိုပါတယ် - မဟုတ်ရင် saved data ကို ပြန်ဖတ်တဲ့အခါ error တက်နိုင်ပါတယ်။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • useEffect dependency array ထဲမှာ key ကို ချန်ထားလို့ key ပြောင်းရင် localStorage ကို sync မလုပ်တော့တာ
  • useMemo dependency array ထဲမှာ filter ကို ထည့်ဖို့ မေ့သွားလို့ filter button နှိပ်တောင် list ပြောင်းမပြတာ

အခု ကိုယ်တိုင် စမ်းကြည့်

Task count ('3 tasks left' ဆိုသလို) ကို filter bar ဘေးမှာ ထည့်ပြပါ - active task အရေအတွက်ကို useMemo နဲ့ calculate လုပ်ကြည့်ပါ၊ 5 minutes လောက်ပဲ ကြာပါမယ်။

You'll know it worked when: Browser refresh လုပ်တောင် task list မပျောက်တော့ဘဲ၊ filter button တွေနှိပ်တဲ့အခါ Active/Done task များပဲ ချက်ချင်းစီညှိပြသွားပါလိမ့်မယ်။

Project: Task Tracker Polish | Thuta Learning