<Fragment> (<>...</>)
<Fragment>
๋ ์ข
์ข
<>...</>
๊ตฌ๋ฌธ์ผ๋ก ์ฌ์ฉ๋๊ณ , ๋ํผ ๋
ธ๋ ์์ด ์๋ฆฌ๋จผํธ๋ฅผ ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค.
<> <OneChild /> <AnotherChild /> </>
๋ ํผ๋ฐ์ค
<Fragment>
ํ๋์ ์๋ฆฌ๋จผํธ๊ฐ ํ์ํ ์ํฉ์์ ์๋ฆฌ๋จผํธ๋ฅผ <Fragment>
๋ก ๊ฐ์ธ์ ๊ทธ๋ฃนํํ์ธ์. Fragment
์์์ ๊ทธ๋ฃนํ๋ ์๋ฆฌ๋จผํธ๋ DOM ๊ฒฐ๊ณผ๋ฌผ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค. ์ฆ, ์๋ฆฌ๋จผํธ๊ฐ ๊ทธ๋ฃนํ๋์ง ์์ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋น JSX ํ๊ทธ์ธ <></>
๋ <Fragment></Fragment>
์ ์ค์๋ง์
๋๋ค.
Props
- optional
key
: ๋ช ์์ <Fragment>
๋ก ์ ์ธ๋ Fragment์๋ key๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฃผ์ ์ฌํญ
-
Fragment์
key
๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด<>...</>
๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ช ์์ ์ผ๋กreact
์์Fragment
๋ฅผ importํ๊ณ<Fragment key={yourKey}>...</Fragment>
๋ฅผ ๋ ๋๋งํด์ผ ํฉ๋๋ค. -
React๋
<><Child /></>
์์[<Child />]
๋ก ๋ ๋๋งํ๊ฑฐ๋ (๋๋ ๋ฐ๋์ ๊ฒฝ์ฐ), ํน์<><Child /></>
์์<Child />
๋ ๋๋งํ๊ฑฐ๋ (๋๋ ๋ฐ๋์ ๊ฒฝ์ฐ) state๋ฅผ ์ด๊ธฐํํ์ง ์์ต๋๋ค. ์ด๋ ์ค์ง single level๊น์ง ์ ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด<><><Child /></></>
์์<Child />
๋ก ๋ ๋๋งํ๋ ๊ฒ์ state๊ฐ ์ด๊ธฐํ๋ฉ๋๋ค. ์ ํํ semantics๋ ์ฌ๊ธฐ์ ์ฐธ์กฐํ์ค ์ ์์ต๋๋ค.
์ฌ์ฉ๋ฒ
์ฌ๋ฌ ์๋ฆฌ๋จผํธ ๋ฐํํ๊ธฐ
์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ํจ๊ป ๊ทธ๋ฃนํํ๊ธฐ ์ํด Fragment
๋ <>...</>
๋ฌธ๋ฒ์ ์ฌ์ฉํ์ธ์. ํ ๊ฐ์ ์๋ฆฌ๋จผํธ๊ฐ ์กด์ฌํ ์ ์๋ ๊ณณ์ ์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ๋ฃ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ปดํฌ๋ํธ๋ ํ ๊ฐ์ ์๋ฆฌ๋จผํธ๋ง ๋ฐํํ ์ ์์ง๋ง Fragment๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ํจ๊ป ๊ทธ๋ฃนํํ์ฌ ๋ฐํํ ์ ์์ต๋๋ค.
function Post() { return ( <> <PostTitle /> <PostBody /> </> ); }
Fragment๋ก ์๋ฆฌ๋จผํธ๋ฅผ ๊ทธ๋ฃนํํ๋ฉด DOM ์๋ฆฌ๋จผํธ์ ๊ฐ์ ๋ค๋ฅธ ์ปจํ
์ด๋๋ก ์๋ฆฌ๋จผํธ๋ฅผ ๊ฐ์ธ๋ ๊ฒฝ์ฐ์๋ ๋ฌ๋ฆฌ ๋ ์ด์์์ด๋ ์คํ์ผ์ ์ํฅ์ ์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ Fragment๋ ํจ๊ณผ์ ์
๋๋ค. ๋ธ๋ผ์ฐ์ ๋ก ์๋ ์์ ๋ฅผ ๊ฒ์ฌํ๋ฉด ๋ชจ๋ <h1>
, <article>
DOM ๋
ธ๋๊ฐ ๋ํผ ์์ด ํ์ ๋
ธ๋๋ก ๋ํ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
Deep Dive
์์ ์์๋ React์์ Fragment
๋ฅผ import ํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
import { Fragment } from 'react'; function Post() { return ( <Fragment> <PostTitle /> <PostBody /> </Fragment> ); }
์ผ๋ฐ์ ์ผ๋ก Fragment
์ key
๋ฅผ ๋๊ฒจ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์ด ๊ธฐ๋ฅ์ ํ์ํ์ง ์์ต๋๋ค.
๋ณ์์ ์ฌ๋ฌ ์๋ฆฌ๋จผํธ ํ ๋น
๋ค๋ฅธ ์๋ฆฌ๋จผํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก Fragment๋ฅผ ๋ณ์์ ํ ๋นํ๊ณ props๋ก ์ ๋ฌํ๋ ๋ฑ์ ์์ ์ ํ ์ ์์ต๋๋ค.
function CloseDialog() { const buttons = ( <> <OKButton /> <CancelButton /> </> ); return ( <AlertDialog buttons={buttons}> Are you sure you want to leave this page? </AlertDialog> ); }
ํ ์คํธ์ ํจ๊ป ์๋ฆฌ๋จผํธ ๊ทธ๋ฃนํ
Fragment
๋ฅผ ์ฌ์ฉํ์ฌ ํ
์คํธ๋ฅผ ์ปดํฌ๋ํธ์ ํจ๊ป ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค.
function DateRangePicker({ start, end }) { return ( <> From <DatePicker date={start} /> to <DatePicker date={end} /> </> ); }
Fragment ๋ฆฌ์คํธ ๋ ๋๋ง
<></>
๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ ๋์ ๋ช
์์ ์ผ๋ก Fragment
๋ฅผ ์์ฑํด์ผ ํ๋ ์ํฉ์ด ์์ต๋๋ค. ๋ฐ๋ณต์ ํตํด ์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ๋ ๋๋งํ ๋ ๊ฐ ์์์ key
๋ฅผ ํ ๋นํด์ผ ํฉ๋๋ค. ๋ฐ๋ณต ์์ ์๋ฆฌ๋จผํธ๊ฐ Fragment์ธ ๊ฒฝ์ฐ key
์์ฑ์ ์ ๊ณตํ๊ธฐ ์ํด ์ผ๋ฐ JSX ์๋ฆฌ๋จผํธ ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
function Blog() { return posts.map(post => <Fragment key={post.id}> <PostTitle title={post.title} /> <PostBody body={post.body} /> </Fragment> ); }
DOM์ ๊ฒ์ฌํ์ฌ Fragment ์์ ์ฃผ์์ ๋ํผ ์๋ฆฌ๋จผํธ๊ฐ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.