๐Ÿ”€ Multiple Returns (React)

ืžื” ื–ื” โ€œMultiple Returnsโ€ ื•ืœืžื” ื–ื” ื˜ื•ื‘?

โ€œMultiple Returnsโ€ ื”ื•ื ื“ืคื•ืก ืจื™ื ื“ื•ืจ ืฉื‘ื• ืžื—ื–ื™ืจื™ื ืžื•ืงื“ื (Early Return) UI ืฉื•ื ื” ื‘ื”ืชืื ืœืžืฆื‘ ื”ื ื•ื›ื—ื™ ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื”: ื˜ืขื™ื ื”, ืฉื’ื™ืื”, ืื™ืŸ ื ืชื•ื ื™ื, ื”ืฆืœื—ื” ื•ื›ืŸ ื”ืœืื”. ื‘ืžืงื•ื ื˜ืจื™ื ืจื™ื™ื ืขืžื•ืงื™ื ื•ึพif / else ืžืงื•ื ื ื™ื, ื‘ื•ื“ืงื™ื ืžืฆื‘ื™ื ืœืคื™ ืกื“ืจ ืขื“ื™ืคื•ื™ื•ืช ื•ืžื—ื–ื™ืจื™ื ืืช ื”ึพUI ื”ืžืชืื™ื ื‘ืฉื•ืจื•ืช ืงืฆืจื•ืช ื•ื‘ืจื•ืจื•ืช.

ื™ืชืจื•ื ื•ืช ืžืจื›ื–ื™ื™ื

  • ืงืจื™ืื•ืช ืžืขื•ืœื”: ื›ืœ ืžืฆื‘ ืžื•ืคืจื“ ืœื‘ืœื•ืง ืงื˜ืŸ ืฉืงืœ ืœื”ื‘ื™ืŸ ื•ืœืชื—ื–ืง.
  • ื‘ืงืจื” ืขืœ ื”ื–ืจื™ืžื”: ืขื•ืฆืจื™ื ืžื•ืงื“ื ื‘ืžืฆื‘ื™ ื‘ื™ื ื™ื™ื/ื—ืจื™ื’ื™ื ื•ืœื โ€œืกื•ื—ื‘ื™ืโ€ ืœื•ื’ื™ืงื” ืžื™ื•ืชืจืช.
  • ื”ืคืจื“ืช ืื—ืจื™ื•ืช: ื ื™ืชืŸ ืœื”ื•ืฆื™ื ื›ืœ ืžืฆื‘ ืœืงื•ืžืคื•ื ื ื˜ื” ืงื˜ื ื” (Loader, Error, Empty).
  • ื”ืชืืžื” ื˜ื‘ืขื™ืช ืœึพdata fetching: ื‘ืžื™ื•ื—ื“ ืขื ืกืคืจื™ื•ืช ื›ืžื• React Query ืื• Fetch ืจื’ื™ืœ.

ืžืชื™ ืœื”ืฉืชืžืฉ?

  • ื˜ืขื™ื ื”/ืฉื’ื™ืื”/ืจื™ืง/ื”ืฆืœื—ื” ื‘ืขืช ื”ื‘ืืช ื ืชื•ื ื™ื.
  • ืฉืขืจื™ ื’ื™ืฉื” (Auth): ืœื ืžื—ื•ื‘ืจ โ†’ ื”ื—ื–ืจ ืžืกืš ื”ืชื—ื‘ืจื•ืช, ืื—ืจืช ื”ืžืฉืš.
  • Feature Flags: ืื ืคื™ืฆืณืจ ื›ื‘ื•ื™ โ†’ ื”ื—ื–ืจ ื’ืจืกื” ื™ืฉื ื”, ืื ื“ื•ืœืง โ†’ ื”ื—ื“ืฉื”.
  • ื•ืœื™ื“ืฆื™ื” ืฉืœ ืคืจืžื˜ืจื™ื/ื ืชื™ื‘ื™ื: ืคืจืžื˜ืจ ื—ืกืจ/ืฉื‘ื•ืจ โ†’ ื”ื•ื“ืขื” ืžืชืื™ืžื”.

ื—ื•ืงื™ ื–ื”ื‘

  • ื—ื•ืงื™ Hooks: ื›ืœ ื”ึพhooks ื—ื™ื™ื‘ื™ื ืœื”ื™ืงืจื ืชืžื™ื“ ื•ื‘ืื•ืชื• ืกื“ืจ. ืืœ ืชื—ื–ื™ืจื• ืœืคื ื™ ืฉืงืจืืชื ืœื”ื•ืงื™ื ื”ื“ืจื•ืฉื™ื ืœืจื ื“ืจ ื”ื–ื”.
  • ืกื“ืจ ื‘ื“ื™ืงื•ืช ืžื•ืžืœืฅ: Loading โ†’ Error โ†’ Empty โ†’ Success.
  • ืฆืžืฆื•ื ืฉื›ืคื•ืœ UI: ืื ื›ืžื” ืžืฆื‘ื™ื ืžืฉืชืคื™ื ืžื‘ื ื” ื“ื•ืžื”, ื”ืคื™ืงื• ืจื›ื™ื‘ื™ ืžืฉื ื” (Loader, ErrorMsg, Empty).
  • ื ื’ื™ืฉื•ืช/UX: ื‘ืžืฆื‘ื™ ื˜ืขื™ื ื” ืืจื•ื›ื™ื ืฉืงืœื• Skeleton; ื‘ืžืฆื‘ื™ ืฉื’ื™ืื” ืกืคืงื• ืคืขื•ืœื” ืœืชื™ืงื•ืŸ (ื›ืžื• โ€œื˜ืขืŸ ืฉื•ื‘โ€).

ื”ืฉื•ื•ืื” ืงืฆืจื”

Multiple Returns (ืžื•ืžืœืฅ):

if (isLoading) return <Loader/>;
if (error)     return <ErrorMsg/>;
if (!data)     return <Empty/>;
return <List data={data}/>;

ื˜ืจื™ื ืจื™ื™ื ืžืงื•ื ื ื™ื (ืงืฉื” ืœืงืจื•ื):

return isLoading ? <Loader/> :
  error ? <ErrorMsg/> :
  !data ? <Empty/> :
  <List data={data}/>;

ื”ืขืจื•ืช ืœึพNext.js

  • Server Components: ืื™ืŸ hooks ืฉืœ ืœืงื•ื—, ืื‘ืœ ืขื“ื™ื™ืŸ ืืคืฉืจ โ€œืœื”ื—ื–ื™ืจ ืžื•ืงื“ืโ€ (ืื• ืœื”ืฉืชืžืฉ ื‘ึพnotFound()/redirect()).
  • Suspense/Streaming: ืื ืืชื ืžืฉืชืžืฉื™ื ื‘ึพ<Suspense> ืœื˜ืขื™ื ื”, ื”ึพfallback ืžื˜ืคืœ ื‘ึพLoading, ื•ืขื“ื™ื™ืŸ ืชื•ื›ืœื• ืœื”ื—ื–ื™ืจ ืžื•ืงื“ื ืœึพError/Empty ืœืคื™ ืฆื•ืจืš.

1) ื“ื•ื’ืžื” ื‘ืกื™ืกื™ืช (Interactive)

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

ื‘ื—ืจ/ื™ ืžืฆื‘ ืœืจื™ื ื“ื•ืจ

2) ื“ื•ื’ืžื” ื›ืžื•ึพืืžื™ืชื™ืช (ืกื™ืžื•ืœืฆื™ื™ืช fetch)

ืžื“ืžื™ื ื‘ืงืฉืช ืจืฉืช: ืชื—ื™ืœื” ื˜ืขื™ื ื”, ืื—ืดื› ืฉื’ื™ืื” ืื• ื ืชื•ื ื™ื. ืฉื™ืžื• ืœื‘ ืœื ื™ืงื•ื™ ื”-setTimeout ื›ื“ื™ ืœืžื ื•ืข ืขื“ื›ื•ืŸ state ืื—ืจื™ ืคื™ืจื•ืง ื”ืงื•ืžืคื•ื ื ื˜ื”.

๐Ÿ“ญ ืื™ืŸ ื ืชื•ื ื™ื

ื˜ื™ืคื™ื ื•ืžื” ืœื ืœืขืฉื•ืช

  • ื—ื•ืงื™ Hooks: ืืœ ืชื‘ืฆืขื• return ืœืคื ื™ ืงืจื™ืื•ืช ืœ-hooks ืฉืืžื•ืจื•ืช ืœื”ื™ืงืจื ื‘ื›ืœ ืจื ื“ืจ.
  • ืกื“ืจ ื‘ื“ื™ืงื•ืช ืžื•ืžืœืฅ: Loading โ†’ Error โ†’ Empty โ†’ Success.
  • ืื ืื™ืŸ ืžื” ืœื”ืฆื™ื’, ืืคืฉืจ return null; (UI ืจื™ืง).
  • ื”ืขื“ื™ืคื• ื”ื—ื–ืจื•ืช ืžื•ืงื“ืžื•ืช ืขืœ ืคื ื™ ื˜ืจื™ื ืจื™ื™ื ืžืงื•ื ื ื™ื ืืจื•ื›ื™ื โ€” ืงืจื™ื ื•ืชื—ื–ืงืชื™ ื™ื•ืชืจ.