React logo

ืœืžื” React? ๐Ÿ’ก

React ื ื•ืœื“ื” ื›ื™ ื”ื™ื” ืงืฉื” ืœืคืชื— ืžืžืฉืงื™ ืžืฉืชืžืฉ ืžื•ื“ืจื ื™ื™ื ืขื ื”ืฉื™ื˜ื•ืช ื”ื™ืฉื ื•ืช. ืœืคื ื™ React, ืคื™ืชื•ื— ื”ึพfrontend ื”ืชื‘ืกืก ืขืœ ืงื‘ืฆื™ JS, HTML, ื•ึพCSS ื ืคืจื“ื™ื, ื•ื”ื“ืคื“ืคืŸ ื”ื™ื” ื˜ื•ืขืŸ ื“ืคื™ื/ืžืฉืื‘ื™ื ืžื—ื“ืฉ ื‘ื›ืœ ืฉื™ื ื•ื™.

ื›ืืฉืจ ื”ืžืฉืชืžืฉ ืจืฆื” ืœื‘ืฆืข ืฉื™ื ื•ื™ ื‘ืืชืจ, ื”ื‘ืงืฉื” ื ืฉืœื—ื” ืœืฉืจืช ื•ื”ื•ื ื”ื—ื–ื™ืจ ืงื‘ืฆื™ื ืžืขื•ื“ื›ื ื™ื. ื–ื” ื”ื•ื‘ื™ืœ ืœืจืขื ื•ื ื™ื ืชื›ื•ืคื™ื, ืงื•ื“ ืžื•ืจื›ื‘ ื•ืžื ื™ืคื•ืœืฆื™ื•ืช DOM ื™ืงืจื•ืช.

ื”ื‘ืขื™ื” ื”ื•ื—ืจืคื” ื‘ื’ืœืœ ืจื™ื‘ื•ื™ ื“ืคื“ืคื ื™ื ื•ื”ื‘ื“ืœื™ ืžื™ืžื•ืฉื™ืโ€”ืงื•ื“ JS ืฉื”ื™ื” ืขื•ื‘ื“ ืžืฆื•ื™ืŸ ื‘ื“ืคื“ืคืŸ ืื—ื“ ืœื ืชืžื™ื“ ืขื‘ื“ ื”ื™ื˜ื‘ ื‘ืื—ืจ. ื‘ืžืงื‘ื™ืœ, ืืชืจื™ื ื›ืžื• Facebook ืื• Airbnb ื“ืจืฉื• ืขื“ื›ื•ื ื™ื ื‘ื–ืžืŸ ืืžืช ื•ื—ื•ื•ื™ื™ืช ืžืฉืชืžืฉ ื—ืœืงื”.

jQuery ื”ืงืœื” ืขืœ ืžื ื™ืคื•ืœืฆื™ื•ืช DOM ื—ื•ืฆื•ืชึพื“ืคื“ืคื ื™ื, ืื‘ืœ ืขื ื”ื–ืžืŸ ืงื‘ืฆื™ ื”ึพJS ื”ืชื ืคื—ื•, ื•ื”ืงื•ื“ ื”ืคืš ืœึพSpaghetti Code. ื‘ืžืงื•ื ืœื•ื’ื™ืงื” ื ืงื™ื™ื”, ื ืฉืืจื ื• ืขื ืขื“ื›ื•ื ื™ื ื ืงื•ื“ืชื™ื™ื ื•ื”ื—ืœืคืช ื—ืœืงื™ื ื‘ึพDOM ื™ื“ื ื™ืช.

ืžื›ืืŸ ื ื•ืœื“ื” ื”ืชืคื™ืกื” ืฉืœ SPA (Single Page Application): ื˜ืขื™ื ื” ื—ื“ึพืคืขืžื™ืช ืฉืœ ื”ืืคืœื™ืงืฆื™ื”, ื•ื›ืœ ืฉืืจ ื”ืขื“ื›ื•ื ื™ื ืงื•ืจื™ื ื‘ืฆื“ึพืœืงื•ื—. ืกืคืจื™ื•ืช ืžื•ืงื“ืžื•ืช ื›ืžื• Backbone.js ืกืœืœื• ื“ืจืš, ืื‘ืœ React (2011 ื‘ืคื™ื™ืกื‘ื•ืง, ืคืชื•ื—ื” ืœืฆื™ื‘ื•ืจ ืžึพ2013) ื”ื‘ื™ืื” ืžื•ื“ืœ ื“ืงืœืจื˜ื™ื‘ื™, ืจื›ื™ื‘ื™ื ืœืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื•ึพVirtual DOM ื™ืขื™ืœโ€”ื•ื–ื” ืฉื™ื ื” ืืช ื”ืžืฉื—ืง.

React - ื”ืฆื’ืช ืฆื“ ืœืงื•ื—

ืžื” ื–ื” React ื‘ื ืงื•ื“ื•ืช

  • ืกืคืจื™ื™ืช JavaScript ื—ื–ืงื” ืœึพUI: React ื”ื™ื ืกืคืจื™ื™ื” (ืœื ืคืจื™ื™ืžื•ื•ืจืง) ืœื‘ื ื™ื™ืช ืžืžืฉืงื™ ืžืฉืชืžืฉ ื“ื™ื ืžื™ื™ื. ื”ื™ื ืžืชืžืงื“ืช ื‘ืฉื›ื‘ืช ื”ึพUI ื‘ืœื‘ื“, ื•ืœื›ืŸ ืžืฉืœื‘ื™ื ืœืคื™ ืฆื•ืจืš ื™ื›ื•ืœื•ืช ืžืฉืœื™ืžื•ืช ื›ืžื• ื ื™ืชื•ื‘ (Routing), ื ื™ื”ื•ืœึพืžืฆื‘ ื•ึพData Fetching. ื”ื’ื™ืฉื” ื”ื“ืงืœืจื˜ื™ื‘ื™ืช ืžืคืฉื˜ืช ืืช ื”ื—ืฉื™ื‘ื”: โ€œืžื” ืœื”ืฆื™ื’โ€ ื‘ืžืงื•ื โ€œืื™ืš ืœืขื“ื›ืŸ ืืช ื”ึพDOMโ€.
  • ืจื›ื™ื‘ื™ื ืœืฉื™ืžื•ืฉ ื—ื•ื–ืจ: ื”ืžืžืฉืง ืžื•ืจื›ื‘ ืžึพComponents ืงื˜ื ื™ื (ื›ืคืชื•ืจ, ื›ืจื˜ื™ืก, ืชืคืจื™ื˜), ืฉื›ืœ ืื—ื“ ื‘ืขืœ ืื—ืจื™ื•ืช ื‘ืจื•ืจื”. ื ื™ืชืŸ ืœืžื—ื–ืจ, ืœื”ืจื›ื™ื‘ (Composition) ื•ืœื‘ื“ื•ืง ืื•ืชื ื‘ืงืœื•ืชโ€”ืžื” ืฉืžืงืฆืจ ืคื™ืชื•ื— ื•ืžืฉืคืจ ืชื—ื–ื•ืงื” ืœืื•ืจืš ื–ืžืŸ.
  • ืžืงื•ืจ: Meta (Facebook): ื ื•ืฆืจื” ื‘ืคื™ื™ืกื‘ื•ืง ืขืดื™ Jordan Walke, ื•ื ืคืชื—ื” ืœืงื•ื“ ืคืชื•ื— ื‘ึพ2013. ื”ื™ื•ื ื”ื™ื ืžื ื•ื”ืœืช ืขืดื™ Meta ื•ื”ืงื”ื™ืœื” ื•ื ืคื•ืฆื” ืžืื•ื“ ื‘ืชืขืฉื™ื™ื”, ืขื ืชื™ืขื•ื“ ืžืฆื•ื™ืŸ ื•ืืงื•ึพืกื™ืกื˜ื ืขืฉื™ืจ.
  • Server Components: ืžืืคืฉืจื™ื ืœื”ืจื™ืฅ ื—ืœืง ืžื”ืจื›ื™ื‘ื™ื ืขืœ ื”ืฉืจืช ื•ืœื”ื—ื–ื™ืจ HTML ืžื•ื›ืŸโ€”ืคื—ื•ืช JavaScript ื ืฉืœื— ืœืœืงื•ื—, ื–ืžืŸ ื˜ืขื™ื ื” ืงืฆืจ ื™ื•ืชืจ ื•ึพSEO ื˜ื•ื‘. ื‘ึพNext.js (App Router) ื–ื” ืžื’ื™ืข โ€œืžื•ื‘ื ื”โ€ ื™ื—ื“ ืขื ื˜ืขื™ื ืช ื ืชื•ื ื™ื, Streaming ื•ึพSuspense.
  • Virtual DOM: React ืžื—ื–ื™ืงื” ื™ื™ืฆื•ื’ ื•ื™ืจื˜ื•ืืœื™ ืฉืœ ื”ึพDOM ื‘ื–ื™ื›ืจื•ืŸ ื•ืžื‘ืฆืขืช diff ื—ื›ื ืžื•ืœ ื”ืžืฆื‘ ื”ืงื•ื“ื. ืจืง ื”ื”ื‘ื“ืœื™ื ื”ืžื™ื ื™ืžืœื™ื™ื ื ื›ืชื‘ื™ื ืœึพDOM ื”ืืžื™ืชื™โ€”ืžื” ืฉืžืงื˜ื™ืŸ ืžื ื™ืคื•ืœืฆื™ื•ืช ื™ืงืจื•ืช, ื›ื•ืœืœ Batching ืื•ื˜ื•ืžื˜ื™ ื‘ืจื™ื ื“ื•ืจ.
  • JSX: ืชื—ื‘ื™ืจ ืฉืžืืคืฉืจ ืœื›ืชื•ื‘ markup ื“ืžื•ื™ึพHTML ื‘ืชื•ืš JavaScript ื‘ืฆื•ืจื” ืงืจื™ืื”. ื‘ื–ืžืŸ ื”ึพbuild ื”ื•ื ืžื•ืžืจ ืœึพJS ืจื’ื™ืœ (ื‘ืืžืฆืขื•ืช Babel/TypeScript ืื• ื”ื‘ื™ืœื“ืจ โ€“ Vite/Next). ืืคืฉืจ ื’ื ืœื”ืฉืชืžืฉ ื‘ึพFragments ื•ืœื”ื—ื–ื™ืจ ืžืขืจื›ื™ื ืฉืœ ืืœืžื ื˜ื™ื ื‘ืœื™ ืขื˜ื™ืคื” ืžื™ื•ืชืจืช.
  • Hooks: API ืคื•ื ืงืฆื™ื•ื ืœื™ ืœืœื•ื’ื™ืงื” ื•ึพstate ื‘ืชื•ืš ืจื›ื™ื‘ื™ื: useState, useEffect,useMemo, useCallback, useRef ื•ืขื•ื“. ืืคืฉืจ ืœื‘ื ื•ืช Hooks ืžื•ืชืืžื™ื (Custom Hooks) ื›ื“ื™ ืœืฉืชืฃ ืœื•ื’ื™ืงื” ื‘ื™ืŸ ืจื›ื™ื‘ื™ื. ื™ืฉ โ€œื›ืœืœื™ Hooksโ€โ€”ืงื•ืจืื™ื ืœื”ื ืจืง ื‘ืจืืฉ ื”ืคื•ื ืงืฆื™ื” ื•ื‘ืขื“ื™ืคื•ืช ืœื ื‘ืชื•ืš ืชื ืื™ื.
  • Props: ื–ืจื™ืžืช ื ืชื•ื ื™ื ื—ื“ึพื›ื™ื•ื•ื ื™ืช ืžื”ื•ืจื” ืœื™ืœื“ ื”ื•ืคื›ืช ืืช ื”ื”ืชื ื”ื’ื•ืช ืœืฆืคื•ื™ื” ื•ืงืœื” ืœื“ื™ื‘ืื’. ื›ืฉืฆืจื™ืš โ€œืœื”ื™ืžื ืข ืžึพprop drillingโ€ ืžืฉืชืžืฉื™ื ื‘ึพContext; ืœื ื™ื”ื•ืœึพืžืฆื‘ ื’ืœื•ื‘ืœื™/ืžื•ืจื›ื‘ ืžืฉืœื‘ื™ื ื›ืœื™ื ื›ืžื• Redux/Zustand, ื•ืœโ€ืžืฆื‘ ืฉืจืชโ€ (Server State) ืžื•ืžืœืฅ TanStack Query/SWR.
  • ืืงื•ึพืกื™ืกื˜ื: ื ื™ืชื•ื‘: react-router ืื• Next.js; ื ื™ื”ื•ืœึพืžืฆื‘: Redux, Zustand, Jotai, Context; ื˜ืขื™ื ืช ื ืชื•ื ื™ื: TanStack Query, SWR; ืกืคืจื™ื•ืช UI: MUI, Chakra, shadcn/ui ื•ืขื•ื“; ื‘ื“ื™ืงื•ืช: React Testing Library, Jest. ื”ืงื”ื™ืœื” ื”ื’ื“ื•ืœื” ืžืกืคืงืช ืชื‘ื ื™ื•ืช, ื“ื•ื’ืžืื•ืช ื•ืคืชืจื•ื ื•ืช ืœื›ืœ ืฆื•ืจืš ื›ืžืขื˜.

โš–๏ธ React vs Vanilla JS

Vanilla JS: ืื™ืžืคืจื˜ื™ื‘ื™ ื•ื ื’ื™ืขื” ื™ืฉื™ืจื” ื‘ึพDOM. React: ื“ืงืœืจื˜ื™ื‘ื™โ€”ืžืชืืจื™ื UI ื›ืคื•ื ืงืฆื™ื” ืฉืœ state ื•ึพReact ืžืกื ื›ืจื ืช.

React vs Vanilla

๐Ÿ“š ืชื•ื›ื ื™ืช ื”ืœื™ืžื•ื“ ื‘ืงื•ืจืก React

โœจ ืžื‘ื•ื ืœ-JSX

1. ืœื™ืžื•ื“ JSX

JSX ื”ื•ื ืชื—ื‘ื™ืจ ืžื™ื•ื—ื“ ืฉืžืฉืœื‘ ื‘ื™ืŸ JavaScript ืœึพHTML. ื”ื•ื ืžืืคืฉืจ ืœื ื• ืœื›ืชื•ื‘ ืงื•ื“ ืฉื ืจืื” ื›ืžื• HTML ืื‘ืœ ืžืชื ื”ื’ ื›ืžื• JavaScript. ื›ืš ืืคืฉืจ ืœืชืืจ ืืช ื”ึพUI ื‘ืฆื•ืจื” ืงืจื™ืื” ื•ื‘ืจื•ืจื”, ื‘ืžืงื•ื ืœื ื”ืœ ืžื ื™ืคื•ืœืฆื™ื•ืช ืขืœ ื”ึพDOM ื™ื“ื ื™ืช.

ื ืœืžื“ ืื™ืš JSX ืขื•ื‘ื“, ืื™ืš ื”ื•ื ืžื•ืžืจ ืœืงื•ื“ JavaScript ืจื’ื™ืœ ืžืื—ื•ืจื™ ื”ืงืœืขื™ื, ื•ื ืจืื” ื“ื•ื’ืžืื•ืช ื‘ืกื™ืกื™ื•ืช ืœืฉื™ืžื•ืฉ ื‘ื• ื‘ืชื•ืš ืจื›ื™ื‘ื™ื.

๐Ÿ—๏ธ ืืชืจ ืขื JSX โ€” ืžื” ื–ื” ื›ื•ืœืœ

ืืชืจ ื‘ึพReact ืžืชื—ื™ืœ ืžืคื™ืจื•ืง ืœืจื›ื™ื‘ื™ื: Header, Navbar, Hero, Cards, Footer. ื‘ืืžืฆืขื•ืช JSX ืื ื—ื ื• ื›ื•ืชื‘ื™ื ืืช ืžื‘ื ื” ื”ึพUI ื‘ืฆื•ืจื” ืงืจื™ืื”, ืžืขื‘ื™ืจื™ื props ื‘ื™ืŸ ืจื›ื™ื‘ื™ื, ื•ืžืžื—ื–ืจื™ื ืจื›ื™ื‘ื™ื ื—ื•ื–ืจื™ื.

(ื›ืฉืชืขืœื” ืืช ื”ืืชืจ ื‘ื”ืžืฉืš โ€” ื ื›ื ื™ืก ื›ืืŸ ื”ื“ื’ืžื” ื—ื™ื”/ืชืžื•ื ื” ืฉืœ ื”ืืชืจ ื•ื ืคืจืง ืื•ืชื• ืœืจื›ื™ื‘ื™ื.)

JSX ื”ื•ื ืชื—ื‘ื™ืจ ืฉืžืืคืฉืจ ืœื›ืชื•ื‘ ืงื•ื“ ืฉื ืจืื” ื›ืžื• HTML ื‘ืชื•ืš JavaScript. ื›ืš ืื ื—ื ื• ืžืชืืจื™ื ืืช ื”ึพUI ื‘ืฆื•ืจื” ื“ืงืœืจื˜ื™ื‘ื™ืช ื•ื ืงื™ื™ื”, ื•ืจื™ืืงื˜ ื›ื‘ืจ ื“ื•ืื’ืช ืœืกื ื›ืจืŸ ืืช ื”ืžืกืš ืขื ื”ึพstate.

ืžืชื—ืช ืชืจืื” ืฉืชื™ ื“ื•ื’ืžืื•ืช ืงืฆืจื•ืช: ืฉื™ืœื•ื‘ ื‘ื™ื˜ื•ื™ื™ื ื‘ืชื•ืš JSX, ื•ืจื™ื ื“ื•ืจ ืจืฉื™ืžื” ื“ื™ื ืžื™ืช ื‘ืขื–ืจืช map.

ื“ื•ื’ืžื” 1 โ€” JSX ื›ื‘ื™ื˜ื•ื™

ืืคืฉืจ ืœืฉืœื‘ ื—ื™ืฉื•ื‘ื™ื, ืชื ืื™ื ืงืฆืจื™ื ื•ึพclassName ื“ื™ื ืžื™:

function Welcome({ user }) {
  const isAdmin = user.role === "admin";
  return (
    <header className={isAdmin ? "p-3 bg-green-100" : "p-3 bg-blue-100"}>
      <h1>ืฉืœื•ื, {user.name}!</h1>
      <p>2 + 2 = {2 + 2}</p>
      <small>{isAdmin ? "ื™ืฉ ืœืš ื”ืจืฉืื•ืช ื ื™ื”ื•ืœ" : "ืžืฉืชืžืฉ ืจื’ื™ืœ"}</small>
    </header>
  );
}

// ืฉื™ืžื•ืฉ:
// <Welcome user={{ name: "ื ื•ืขื”", role: "admin" }} />

ื“ื•ื’ืžื” ืžื•ืจืฆืช ื‘ืคื•ืขืœ:

ืฉืœื•ื, ื ื•ืขื”!

2 + 2 = 4

ื™ืฉ ืœืš ื”ืจืฉืื•ืช ื ื™ื”ื•ืœ

ื“ื•ื’ืžื” 2 โ€” ืจื™ื ื“ื•ืจ ืจืฉื™ืžื” ืขื map

ื ื‘ื ื” ืžืขืจืš ื ืชื•ื ื™ื ื•ื ืจื ื“ืจ ืื•ืชื• ืœึพJSX. ื—ืฉื•ื‘ ืœืชืช key ื™ื™ื—ื•ื“ื™ ืœื›ืœ ืคืจื™ื˜.

const courses = [
  { id: 1, title: "ืžื‘ื•ื ืœ-React" },
  { id: 2, title: "JSX ื•ืจื›ื™ื‘ื™ื" },
  { id: 3, title: "Hooks ื‘ืกื™ืกื™ื™ื" },
];

function CoursesList() {
  return (
    <ul>
      {courses.map((c) => (
        <li key={c.id}>{c.title}</li>
      ))}
    </ul>
  );
}

// ืฉื™ืžื•ืฉ:
// <CoursesList />

ื“ื•ื’ืžื” ืžื•ืจืฆืช ื‘ืคื•ืขืœ:

  • ืžื‘ื•ื ืœ-React
  • JSX ื•ืจื›ื™ื‘ื™ื
  • Hooks ื‘ืกื™ืกื™ื™ื

2. ื‘ื ื™ื™ืช ืืชืจื™ื ืคืฉื•ื˜ื™ื ืขื JSX

ืื—ืจื™ ื”ื”ื™ื›ืจื•ืช ืขื JSX ื ื‘ื ื” ืืชืจื™ื ืงื˜ื ื™ื: ื›ื•ืชืจืช, ืชืคืจื™ื˜, ื›ืคืชื•ืจื™ื, ื•ืชื•ื›ืŸ ื‘ืกื™ืกื™. ื ืชื ืกื” ื‘ื”ืขื‘ืจืช ื ืชื•ื ื™ื ื‘ื™ืŸ ืจื›ื™ื‘ื™ื ื‘ืืžืฆืขื•ืช props, ื•ื ื‘ื™ืŸ ืื™ืš ืžื—ืœืงื™ื ืืชืจ ืœืจื›ื™ื‘ื™ื ืงื˜ื ื™ื ืœืฉื™ืžื•ืฉ ื—ื•ื–ืจ.

ื”ืžื˜ืจื”: ืœืœืžื•ื“ ืื™ืš ืžืคืจืงื™ื ืืชืจ ืœื—ืœืงื™ื ื‘ืจื•ืจื™ื ื•ื‘ื•ื ื™ื ืžืžืฉืง ืคืฉื•ื˜ ื•ืžื•ื‘ืŸ.

3. ืœื™ืžื•ื“ Hooks

Hooks ื”ื ื”ืœื‘ ืฉืœ React ื”ืžื•ื“ืจื ื™ืช. ื”ื ืžืืคืฉืจื™ื ืœื ื”ืœ state, ืžื—ื–ื•ืจ ื—ื™ื™ื ืฉืœ ืจื›ื™ื‘ื™ื (lifecycle), ืฉื™ืžื•ืฉ ื‘ึพcontext ื•ืขื•ื“ โ€” ื•ื›ืœ ื–ื” ื‘ืชื•ืš ืจื›ื™ื‘ื™ ืคื•ื ืงืฆื™ื” ืคืฉื•ื˜ื™ื.

ื ืœืžื“ ืืช ื”ึพHooks ื”ื‘ืกื™ืกื™ื™ื: useState, useEffect,useRef, ื•ื ื‘ื™ืŸ ืืช ื”ื›ืœืœื™ื ื”ื—ืฉื•ื‘ื™ื: ืงืจื™ืื” ืจืง ื‘ืจื›ื™ื‘ื™ื/ืคื•ื ืงืฆื™ื•ืช, ืœื ื‘ืชื•ืš ืชื ืื™ื/ืœื•ืœืื•ืช, ื•ืฉืžื•ืช ืฉืžืชื—ื™ืœื™ื ื‘ึพuse.

  • ืžื” ื–ื” Hooks? ืคื•ื ืงืฆื™ื•ืช ืžื™ื•ื—ื“ื•ืช ืฉืžืืคืฉืจื•ืช ืœื”ืฉืชืžืฉ ื‘ึพstate, lifecycle ื•ึพcontext ื‘ืชื•ืš ืจื›ื™ื‘ื™ ืคื•ื ืงืฆื™ื”, ืžื‘ืœื™ ืœื›ืชื•ื‘ ืžื—ืœืงื•ืช.
  • ืฉืžื•ืช: ื›ืœ Hook ื—ื™ื™ื‘ ืœื”ืชื—ื™ืœ ื‘ึพuse (ื›ืžื• useState, useEffect).
  • ืžื™ืงื•ื: ืžื•ืชืจ ืœืงืจื•ื ืœึพHooks ืจืง ื‘ืชื•ืš ืจื›ื™ื‘ ืคื•ื ืงืฆื™ื•ื ืœื™ ืื• ืคื•ื ืงืฆื™ื” ืฉืœ React, ืœื ื‘ืงื•ื‘ืฅ ืจื’ื™ืœ ืื• ืžื—ื•ืฅ ืœืจื›ื™ื‘.
  • ืื•ืชื™ื•ืช ื’ื“ื•ืœื•ืช ืœืจื›ื™ื‘ื™ื: ืจื›ื™ื‘ื™ React ืขืฆืžื ื—ื™ื™ื‘ื™ื ืœื”ืชื—ื™ืœ ื‘ืื•ืช ื’ื“ื•ืœื” ื›ื“ื™ ืฉึพJSX ื™ื–ื”ื” ืื•ืชื ื›ืจื›ื™ื‘ื™ื.
  • ืœืœื ืชื ืื™ื ืื• ืœื•ืœืื•ืช: ืืกื•ืจ ืœืงืจื•ื ืœึพHooks ื‘ืชื•ืš if,for ืื• while โ€“ ื”ื ื—ื™ื™ื‘ื™ื ืœื”ื•ืคื™ืข ืชืžื™ื“ ื‘ืื•ืชื• ืกื“ืจ.
  • setState ืœื ืžื™ื™ื“ื™: ื”ืคื•ื ืงืฆื™ื” set ืœื ืžืขื“ื›ื ืช state ื‘ืื•ืคืŸ ืžื™ื™ื“ื™, ืืœื ืžืชื–ืžื ืช ืขื“ื›ื•ืŸ ืœืจื™ื ื“ื•ืจ ื”ื‘ื.
  • Custom Hooks: ื ื™ืชืŸ ืœื™ืฆื•ืจ Hooks ืžื•ืชืืžื™ื ืื™ืฉื™ืช ื›ื“ื™ ืœืืจื•ื– ืœื•ื’ื™ืงื” ื—ื•ื–ืจืช ื•ืœืฉืชืฃ ืื•ืชื” ื‘ื™ืŸ ืจื›ื™ื‘ื™ื ืฉื•ื ื™ื.

๐Ÿงฉ ืžื” ื–ื” Hooks (ื‘ืงืฆืจื”)

Hooks ื”ื ืคื•ื ืงืฆื™ื•ืช ืฉืžืชื—ื™ืœื•ืช ื‘ึพuse ื•ืžืืคืฉืจื•ืช ืœื ื”ืœ state, ืžื—ื–ื•ืจ ื—ื™ื™ื (lifecycle), ื’ื™ืฉื” ืœึพ ref, ื•ึพcontext โ€” ื‘ืชื•ืš ืจื›ื™ื‘ื™ ืคื•ื ืงืฆื™ื”. ื”ื ืžื—ืœื™ืคื™ื ืฆื•ืจืš ื‘ืžื—ืœืงื•ืช ื•ืžืคืฉื˜ื™ื ืฉื™ืชื•ืฃ ืœื•ื’ื™ืงื” (ื“ืจืš Custom Hooks).

  • useState โ€“ ื ื™ื”ื•ืœ state ืžืงื•ืžื™.
  • useEffect โ€“ ืชื’ื•ื‘ื” ืœืฉื™ื ื•ื™ื™ื, side-effects ื•ื˜ืขื™ื ืช ื ืชื•ื ื™ื.
  • useRef โ€“ ืื—ืกื•ืŸ ืขืจื›ื™ื ืžืชืžืฉื›ื™ื ื‘ื™ืŸ ืจื™ื ื“ื•ืจื™ื ื•ื’ื™ืฉื” ืœึพDOM.
  • useReducer โ€“ ืืœื˜ืจื ื˜ื™ื‘ื” ืœึพuseState ื›ืฉื™ืฉ ืœื•ื’ื™ืงื” ืžื•ืจื›ื‘ืช ื™ื•ืชืจ, ื‘ืกื’ื ื•ืŸ Redux ืงื˜ืŸ.
  • useMemo โ€“ ืžื–ื›ืจ ืชื•ืฆืื•ืช ื—ื™ืฉื•ื‘ ื™ืงืจ ื›ื“ื™ ืœืฉืคืจ ื‘ื™ืฆื•ืขื™ื.
  • useCallback โ€“ ืžื–ื›ืจ ืคื•ื ืงืฆื™ื•ืช, ื›ื“ื™ ืœืžื ื•ืข ื™ืฆื™ืจื” ืžื—ื“ืฉ ื‘ืจื™ื ื“ื•ืจื™ื ื—ื•ื–ืจื™ื.
  • useId โ€“ ื™ืฆื™ืจืช ืžื–ื”ื™ื ื™ื™ื—ื•ื“ื™ื™ื ืขืงื‘ื™ื™ื ืœืจื›ื™ื‘ื™ื (ื—ืฉื•ื‘ ื‘ื˜ืคืกื™ื ื•ืชื•ื•ื™ื•ืช).
  • useLayoutEffect โ€“ ื›ืžื• useEffect, ืื‘ืœ ืคื•ืขืœ ืœืคื ื™ ืฆื™ื•ืจ ืœืžืกืš (ืœืขื‘ื•ื“ื” ืขื ืžื“ื™ื“ื•ืช DOM ืื• ืื ื™ืžืฆื™ื•ืช).

๐ŸŽ“ ื›ืืŸ ืชืžืฆืื• ืืช ื›ืœ ื”ื“ื•ื’ืžืื•ืช ื•ื”ืคืจื•ื™ืงื˜ื™ื ื‘ื›ืœ ื”ืงื˜ื’ื•ืจื™ื•ืช โ€“ ืžื›ืœ ื”ืชื—ื•ืžื™ื ื•ื”ื ื•ืฉืื™ื ืฉื‘ืœื™ืžื•ื“ React.

Portfolio Project Image

JSX ื•ืจื›ื™ื‘ื™ื ืจืืฉื•ื ื™ื

ืžื‘ื•ื ืœึพReact: ื™ืฆื™ืจืช ืจื›ื™ื‘ื™ื ืคื•ื ืงืฆื™ื•ื ืœื™ื™ื ืขื JSX, ืฉื™ืžื•ืฉ ื‘ึพprops, ืจื™ื ื“ื•ืจ ื“ื™ื ืืžื™ ืฉืœ ืชื•ื›ืŸ.

Portfolio Project Image

ื ื™ื”ื•ืœ ืžืฆื‘ ื•ืื™ืจื•ืขื™ื

ืฉื™ืžื•ืฉ ื‘ึพuseState, ื ื™ื”ื•ืœ ืื™ืจื•ืขื™ื (onClick, onChange) ื•ื™ืฆื™ืจืช ืื™ื ื˜ืจืืงืฆื™ื” ืขื ื”ืžืฉืชืžืฉ.

Portfolio Project Image

React Router

ืฉื™ืžื•ืฉ ื‘ึพreact-router-dom ืœื ื™ื•ื•ื˜ ื‘ื™ืŸ ืขืžื•ื“ื™ื: Routes, Link, useParams, useNavigate.

Portfolio Project Image

ื˜ืคืกื™ื ื•ื‘ืงืจื” ืขืœ ืงืœื˜

ื™ืฆื™ืจืช ื˜ืคืกื™ื ืขื ื‘ืงืจื” ืžืœืื”, ื•ืœื™ื“ืฆื™ื” ื‘ืกื™ืกื™ืช ื•ืฉื™ืžื•ืฉ ื‘ึพcontrolled components.

Portfolio Project Image

ืฆืจื™ื›ืช API ื•ื”ืฆื’ืช ื ืชื•ื ื™ื

ืฉื™ืžื•ืฉ ื‘ึพfetch ืื• axios ืœืฆืจื™ื›ืช ืžื™ื“ืข ื—ื™ืฆื•ื ื™ ื•ื”ืฆื’ืช ื ืชื•ื ื™ื ื‘ืจื›ื™ื‘ื™ื.

Portfolio Project Image

ื ื™ื”ื•ืœ ืžืฆื‘ ื’ืœื•ื‘ืœื™ ืขื Context

ืฉื™ืชื•ืฃ ื ืชื•ื ื™ื ื‘ื™ืŸ ืจื›ื™ื‘ื™ื ืฉื•ื ื™ื ื‘ืขื–ืจืช React Context ื•ึพuseContext.

Portfolio Project Image

ืžื•ื ื” ืงืœื™ืงื™ื ืขื useState

ืคืจื•ื™ืงื˜ ื‘ืกื™ืกื™ ื”ืžื“ื’ื™ื ืื™ืš ืœื™ืฆื•ืจ ื•ืœื”ืฆื™ื’ ืžื•ื ื” ื‘ืขื–ืจืช useState.

Portfolio Project Image

ื˜ื™ื™ืžืจ ืื•ื˜ื•ืžื˜ื™ ืขื useEffect

ืคืจื•ื™ืงื˜ ืฉืžืจื™ืฅ ื˜ื™ื™ืžืจ ืื• ืงืจื™ืืช API ื›ืฉืžืขืœื™ื ืืช ื”ืจื›ื™ื‘, ืขื ื ื™ืงื•ื™ ื ื›ื•ืŸ.

Portfolio Project Image

ืคื•ืงื•ืก ืขืœ ืฉื“ื” ืงืœื˜ ืขื useRef

ืฉื™ืžื•ืฉ ื‘ึพuseRef ืœื”ืคื ื™ื™ืช ืคื•ืงื•ืก ืœืฉื“ื” ืงืœื˜ ืื• ืžื“ื™ื“ืช ื’ื•ื‘ื” ืจื›ื™ื‘.

Portfolio Project Image

ื ื™ื”ื•ืœ ืขื’ืœืช ืงื ื™ื•ืช ืขื useReducer

ื”ื“ื’ืžื” ืฉืœ ื ื™ื”ื•ืœ ืžืฆื‘ื™ื ืžื•ืจื›ื‘ื™ื โ€“ ื”ื•ืกืคื”/ื”ืกืจื” ืฉืœ ืคืจื™ื˜ื™ื ื‘ืขื’ืœื”.

Portfolio Project Image

ืžื ื™ืขืช ื—ื™ืฉื•ื‘ ืžื™ื•ืชืจ ืขื useMemo

ื—ื™ืฉื•ื‘ ืกืš ืกื›ื•ื ืจืง ื›ืืฉืจ ืื—ื“ ืžื”ืขืจื›ื™ื ืžืฉืชื ื” โ€“ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”.

Portfolio Project Image

ืฉืžื™ืจื” ืขืœ ืคื•ื ืงืฆื™ื” ืงื‘ื•ืขื” ืขื useCallback

ื”ืขื‘ืจืช ืคื•ื ืงืฆื™ื•ืช ื›ึพprops ืžื‘ืœื™ ืœื’ืจื•ื ืœืจื™ื ื“ื•ืจ ืžื™ื•ืชืจ ืฉืœ ืจื›ื™ื‘ื™ื.

Portfolio Project Image

ืžื“ื™ื“ืช ืจื›ื™ื‘ ืœืคื ื™ ืจื™ื ื“ื•ืจ

ื”ื“ื’ืžื” ืžืชื™ ืœื”ืฉืชืžืฉ ื‘ึพuseLayoutEffect ื•ืœื ื‘ึพuseEffect.

Portfolio Project Image

ืฉื“ื•ืช ื˜ื•ืคืก ืขื useId

ื™ืฆื™ืจืช ืžื–ื”ื™ื ื™ื™ื—ื•ื“ื™ื™ื ืœื˜ืคืกื™ื ื“ื™ื ืžื™ื™ื ื‘ืฆื•ืจื” ื ื’ื™ืฉื” ื•ื ื›ื•ื ื”.

๐Ÿš€ ืžื” ื ืชืจื’ืœ ืื—ืจื™ ื”-Hooks

ืื—ืจื™ ืฉื ื›ื™ืจ ืืช ื”-Hooks ื•ื ืจืื” ื“ื•ื’ืžืื•ืช ื‘-PortfolioMain, ื ื™ื™ืฉื ืื•ืชื ื‘ื‘ื ื™ื™ืช ืืชืจื™ื ืžื•ืจื›ื‘ื™ื: ื ื™ืชื•ื‘ ื‘ื™ืŸ ืขืžื•ื“ื™ื, ื˜ืคืกื™ื ืขื ื•ืœื™ื“ืฆื™ื”, ื˜ืขื™ื ืช ื ืชื•ื ื™ื, ืฉื™ืชื•ืฃ ืœื•ื’ื™ืงื” ืขื Custom Hooks ื•ืขื•ื“.

4. ื‘ื ื™ื™ืช ืคืจื•ื™ืงื˜ื™ื ืขื ืกื•ื’ื™ Hooks

ื ืชืจื’ืœ ื›ืœ Hook ืขื ืคืจื•ื™ืงื˜ ืงื˜ืŸ: useState ืขื ืžื•ื ื”,useEffect ืœื˜ืขื™ื ืช ื ืชื•ื ื™ื, useRefืœื ื™ื”ื•ืœ DOM, ื•ึพuseContext ืœื ื™ื”ื•ืœ ื ืชื•ื ื™ื ื‘ื™ืŸ ืจื›ื™ื‘ื™ื.

ื”ืžื˜ืจื”: ืœื”ื‘ื™ืŸ ืื™ืš ื›ืœ Hook ืคื•ืชืจ ื‘ืขื™ื” ืืžื™ืชื™ืช ื‘ื‘ื ื™ื™ืช ื™ื™ืฉื•ืžื™ื ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ื™ื.

5. ืืชืจื™ื ืžื•ืจื›ื‘ื™ื ืขื Hooks

ืื—ืจื™ ื”ื”ื‘ื ื” ืฉืœ Hooks ื ื‘ื ื” ืืชืจื™ื ืฉืœืžื™ื: ื“ืคื™ ืคืจื•ืคื™ืœ ืขื ืžื™ื“ืข ื“ื™ื ืžื™, ื˜ืคืกื™ื ืขื ื•ืœื™ื“ืฆื™ื”, ื•ืจื›ื™ื‘ื™ื ืฉืžืชืงืฉืจื™ื ื‘ื™ื ื™ื”ื. ื ืฉืœื‘ Hooks ืžื•ืชืืžื™ื ืื™ืฉื™ืช (Custom Hooks) ื›ื“ื™ ืœืืจื•ื– ืœื•ื’ื™ืงื” ืฉื—ื•ื–ืจืช ืขืœ ืขืฆืžื”.

ื›ืืŸ ื›ื‘ืจ ื ืชื—ื™ืœ ืœื”ืจื’ื™ืฉ ืื™ืš React ื—ื•ืกื›ืช ื–ืžืŸ ื•ืžืกื“ืจืช ืืช ื”ืงื•ื“.

6. ื ื•ืฉืื™ื ืžืชืงื“ืžื™ื

  • Routing: ืžืขื‘ืจ ื‘ื™ืŸ ื“ืคื™ื ื‘ืืคืœื™ืงืฆื™ื” (ืขื react-routerืื• Next.js).
  • ื ื™ื”ื•ืœ ืžืฆื‘: ืฉื™ืžื•ืฉ ื‘ึพContext ืœืžื ื™ืขืช Prop Drilling, ื•ื”ื™ื›ืจื•ืช ืขื Redux/Zustand ืœืžืขืจื›ื•ืช ื’ื“ื•ืœื•ืช.
  • ื˜ืขื™ื ืช ื ืชื•ื ื™ื: ืฉื™ืžื•ืฉ ื‘ึพfetch, ื˜ื™ืคื•ืœ ื‘ืฉื’ื™ืื•ืช/ื˜ืขื™ื ื”, ื•ึพTanStack Query/SWR ืœื ื™ื”ื•ืœ โ€œืžืฆื‘ ืฉืจืชโ€.
  • ืขื‘ื•ื“ื” ืขื ื˜ืคืกื™ื: Controlled/Uncontrolled, ื•ืœื™ื“ืฆื™ื”, ื•ึพreact-hook-form.
  • ื‘ื™ืฆื•ืขื™ื: useMemo, useCallback,memo, ื•ืคื™ืจื•ืง ืงื•ื“ (Lazy Loading).
  • ื ื’ื™ืฉื•ืช: ืื™ืš ืœื”ื‘ื˜ื™ื— ืฉื”ืืชืจ ื ื•ื— ื’ื ืœืžืงืœื“ืช/ืงื•ืจืื™ ืžืกืš.
  • ื‘ื“ื™ืงื•ืช: React Testing Library + Jest ืœื•ื•ื“ื ืฉื”ืงื•ื“ ืขื•ื‘ื“ ื›ืžื• ืฉืฆืจื™ืš.
  • Next.js: ืฉื™ืœื•ื‘ ืจืื•ื˜ื™ื ื’, Server Components ื•ึพSEO.
  • TypeScript: ื›ืชื™ื‘ื” ืขื ื˜ื™ืคื•ืกื™ื ืœืฉื™ืคื•ืจ ืืžื™ื ื•ืช ื”ืงื•ื“.
  • ื“ื™ืคืœื•ื™: ืื™ืš ืœื”ืขืœื•ืช ืืช ื”ืืชืจ ืœึพVercel/Netlify ื•ืœืฉืชืฃ ืขื ื”ืขื•ืœื.