<Fragment> (<>...</>)
<Fragment>
๋ ์ข
์ข
<>...</>
๊ตฌ๋ฌธ์ผ๋ก ์ฌ์ฉ๋๊ณ , ๋ํผ ๋
ธ๋ ์์ด ์๋ฆฌ๋จผํธ๋ฅผ ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค.
<>
<OneChild />
<AnotherChild />
</>
Reference
<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 ๋
ธ๋๊ฐ ๋ํผ ์์ด ํ์ ๋
ธ๋๋ก ๋ํ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
export default function Blog() { return ( <> <Post title="An update" body="It's been a while since I posted..." /> <Post title="My new blog" body="I am starting a new blog!" /> </> ) } function Post({ title, body }) { return ( <> <PostTitle title={title} /> <PostBody body={body} /> </> ); } function PostTitle({ title }) { return <h1>{title}</h1> } function PostBody({ body }) { return ( <article> <p>{body}</p> </article> ); }
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 ์์ ์ฃผ์์ ๋ํผ ์๋ฆฌ๋จผํธ๊ฐ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
import { Fragment } from 'react'; const posts = [ { id: 1, title: 'An update', body: "It's been a while since I posted..." }, { id: 2, title: 'My new blog', body: 'I am starting a new blog!' } ]; export default function Blog() { return posts.map(post => <Fragment key={post.id}> <PostTitle title={post.title} /> <PostBody body={post.body} /> </Fragment> ); } function PostTitle({ title }) { return <h1>{title}</h1> } function PostBody({ body }) { return ( <article> <p>{body}</p> </article> ); }