๐Ÿ“˜ [Recat] React ํ•ต์‹ฌ - ์‹ฌํ™”๋‹จ๊ณ„

๐Ÿ“˜ [Recat] React ํ•ต์‹ฌ - ์‹ฌํ™”๋‹จ๊ณ„

[Recat] React ํ•ต์‹ฌ - ์‹ฌํ™”๋‹จ๊ณ„

ย Fragments(ํ”„๋ž˜๊ทธ๋จผํŠธ) ์‚ฌ์šฉ๋ฒ•

๋‹ค์Œ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ

ย return (
  <Header />
  <main>...</main>
);

๋‘ ๊ฐœ์˜ ํ˜•์ œ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค ํ•˜๊ธฐ ๋•Œ๋ฌธ์— JSX ์—๋Ÿฌ ๋ฐœ์ƒ
โ†’ JSX expressions must have one parent element

  • JSX๋Š” ๊ฒฐ๊ตญ React.createElement(...) ํ˜ธ์ถœ๋กœ ๋ณ€ํ™˜๋จ
  • ํ•จ์ˆ˜๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋“ฏ์ด,
    JSX๋„ ํ•˜๋‚˜์˜ ์š”์†Œ๋งŒ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ

ํ•ด๊ฒฐ์ฑ… 1: ๋ถˆํ•„์š”ํ•œ <div>๋กœ ๊ฐ์‹ธ๊ธฐ

return (
  <div>
    <Header />
    <main>...</main>
  </div>
);
  • ์˜ค๋ฅ˜๋Š” ํ•ด๊ฒฐ๋˜์ง€๋งŒ, ๋ถˆํ•„์š”ํ•œ div๊ฐ€ DOM์— ์ƒ๊น€

ํ•ด๊ฒฐ์ฑ… 2: React.Fragment ์‚ฌ์šฉ

import { Fragment } from 'react';

return (
  <Fragment>
    <Header />
    <main>...</main>
  </Fragment>
);
  • ์‹ค์ œ๋กœ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š” ๊ฐ€์ƒ์˜ ์š”์†Œ
  • DOM์— ์•„๋ฌด๊ฒƒ๋„ ๋‚จ๊ธฐ์ง€ ์•Š์Œ

ํ•ด๊ฒฐ์ฑ… 3: ์ถ•์•ฝ ๋ฌธ๋ฒ• <> ... </>

return (
  <>
    <Header />
    <main>...</main>
  </>
);
  • Fragment์˜ ์ถ•์•ฝํ˜•
  • ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  React ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๊ฐ€์žฅ ๊น”๋”ํ•˜๊ณ  ๊ฐ„ํŽธํ•œ ๋ฐฉ๋ฒ•

๊ฐ์‹ธ์ง„ ์š”์†Œ์— Props(์†์„ฑ) ์ „๋‹ฌํ•˜๊ธฐ

function Wrapper({ title, children, ...props }) {
  return <section {...props}>...</section>;
}
  • title, children์€ ์ง์ ‘ ๊บผ๋‚ด ์‚ฌ์šฉ
  • ๋‚˜๋จธ์ง€ ๋ชจ๋“  props๋Š” props ๊ฐ์ฒด์— ์ž๋™ ์ˆ˜์ง‘๋จ
  • ์ˆ˜์ง‘๋œ props๋Š” <section>์— ...props๋กœ ์ „๋‹ฌ๋จ ๐Ÿ‘‰ ํšจ๊ณผ: <Wrapper id="examples" className="my-section" /> ๋“ฑ์˜ ์ถ”๊ฐ€ props๋„ ์ž๋™ ์ „๋‹ฌ๋จ
function TabButton({ children, ...props }) {
  return <button {...props}>{children}</button>;
}
  • ์™ธ๋ถ€์—์„œ ์ „๋‹ฌ๋œ onClick, className, type ๋“ฑ ๋ชจ๋“  props๋ฅผ ์ž๋™ ์ „๋‹ฌ
  • ๋‚ด๋ถ€์—์„œ๋Š” ๋ณ„๋„๋กœ prop์„ ๊บผ๋‚ด์ง€ ์•Š์•„๋„ ๋จ
  • ์ด ํŒจํ„ด์€ ๋‚ด์žฅ ์š”์†Œ์— ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•  ์†์„ฑ์ด ๋งŽ์„ ๋•Œ ํŠนํžˆ ์œ ์šฉ

์ปดํฌ๋„ŒํŠธ ํƒ€์ž… ๋™์ ์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ

๋™์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋‚˜ HTML ํƒœ๊ทธ๋ฅผ props๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค

์˜ˆ: <Tabs buttonsContainer="menu" />

  • buttonsContainer๋Š” ๋ฌธ์ž์—ด "menu"๋กœ, HTML ํƒœ๊ทธ(<menu>)๋กœ ํ•ด์„๋จ. ๋‚ด์žฅ HTML ์š”์†Œ ๋˜๋Š”: <Tabs buttonsContainer={Section} />
  • ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ Section์„ ์ „๋‹ฌํ•จ. ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ

Tabs ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ฐ›์€ ๊ฐ’์„ JSX ํƒœ๊ทธ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

function Tabs({ buttonsContainer }) {
  const ButtonsContainer = buttonsContainer; // ์ค‘์š”: ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘
  return (
    <ButtonsContainer>
      {/* ๋ฒ„ํŠผ๋“ค */}
    </ButtonsContainer>
  );
}
  • ๋ฆฌ์•กํŠธ๋Š” ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” JSX ํƒœ๊ทธ๋ฅผ ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ๋กœ ์ธ์‹ํ•จ
  • ์ „๋‹ฌ๋ฐ›์€ buttonsContainer ๊ฐ’์— ๋”ฐ๋ผ HTML ํƒœ๊ทธ๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑ ๊ฐ€๋Šฅ

๋‚ด์žฅ HTML ํƒœ๊ทธ๋Š” ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ, ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜ ์ฐธ์กฐ๋กœ ์ „๋‹ฌ - buttonsContainer="menu" โ†’ <menu>๋กœ ๋ Œ๋”๋ง - buttonsContainer={Section} โ†’ <Section>์œผ๋กœ ๋ Œ๋”๋ง

์ด๋ฏธ์ง€ ์ €์žฅ์†Œ๋Š” public/ VS assets/

  • public/ ํด๋” ์‚ฌ์šฉ ์‹œ์ 
    • HTML์—์„œ ์ง์ ‘ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š” ์ด๋ฏธ์ง€
    • ์™ธ๋ถ€์—์„œ URL๋กœ ์ง์ ‘ ์ ‘๊ทผ์ด ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค
    • ๋นŒ๋“œ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ •์  ์œ ์ง€๋ผ์•ผ ํ•  ํŒŒ์ผ
  • src/assets/ ํด๋” ์‚ฌ์šฉ ์‹œ์ 
    • ์ปดํฌ๋„ŒํŠธ์—์„œ importํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€
    • ๋ฆฌ์•กํŠธ ์•ฑ์˜ ๊ตฌ์„ฑ์š”์†Œ์™€ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋ง๋˜์–ด์•ผ ํ•  ๋ฆฌ์†Œ์Šค
    • ๋นŒ๋“œ ๊ณผ์ •์—์„œ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค

๐Ÿ“‘ Reference



Pagination


ยฉ 2025. All rights reserved.

Powered by Hydejack v9.2.1