
React ์ปดํฌ๋ํธ๋ ์ฌ์ค ํจ์๋ค.
๊ทธ๋ฆฌ๊ณ JavaScript์์๋ ํจ์๋ ๊ฐ์ฒด์ฒ๋ผ ์์ฑ์ ๊ฐ์ง ์ ์๋ค!
์์
function sayHi() {
console.log("hi");
}
sayHi.language = "Korean";
console.log(sayHi.language); // Korean
์ด ๊ฐ๋ ์ React์ ์์ฉํ๋ฉด ๋ค์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค!
function Dropdown({ children }) {
return <div>{children}</div>;
}
Dropdown.Trigger = function Trigger() {
return <button>์ด๊ธฐ</button>;
};
Dropdown.Item = function Item({ children }) {
return <div>{children}</div>;
};
์ด์ ์ ์์๋ฅผ ๋ฐํ์ผ๋ก ์๋์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
<Dropdown>
<Dropdown.Trigger />
<Dropdown.Item>ํญ๋ชฉ</Dropdown.Item>
</Dropdown>
-> ์ด ๋ฐฉ์์ ๋ฐ๋ก Compound Component ํจํด์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
function Dropdown() {
const [open, setOpen] = useState(false);
return (
<div>
<button onClick={() => setOpen(!open)}>{open ? "๋ซ๊ธฐ" : "์ด๊ธฐ"}</button>
{open && <div>ํญ๋ชฉ</div>}
</div>
);
}
์ด ๋ฐฉ์์ ๋จ์ํ๊ธด ํ์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๋ค.
const DropdownContext = createContext();
function Dropdown({ children }) {
const [open, setOpen] = useState(false);
return (
<DropdownContext.Provider value={{ open, setOpen }}>
<div>{children}</div>
</DropdownContext.Provider>
);
}
Dropdown.Trigger = function Trigger() {
const { open, setOpen } = useContext(DropdownContext);
return <button onClick={() => setOpen(!open)}>{open ? "๋ซ๊ธฐ" : "์ด๊ธฐ"}</button>;
};
Dropdown.Item = function Item({ children }) {
const { open } = useContext(DropdownContext);
return open ? <div>{children}</div> : null;
};
์ด์ ์๋์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
<Dropdown>
<Dropdown.Trigger />
<Dropdown.Item>๋ด์ฉ</Dropdown.Item>
</Dropdown>
Dropdown.Trigger, Dropdown.Item์ ๊ฐ๊ฐ Dropdown ์์์๋ง ๋์ํ๊ฒ ์ค๊ณ๋ ํ์ ์ปดํฌ๋ํธ์ด๋ค.
๐งฉ {children} ์ด๋?
React์์ {children}์ ์ปดํฌ๋ํธ ํ๊ทธ ์์ ์๋ ๋ด์ฉ์ ๊ฐ๋ฆฌํจ๋ค.<Dropdown> <Dropdown.Trigger /> <Dropdown.Item>๋ด์ฉ</Dropdown.Item> </Dropdown>์ด ๊ฒฝ์ฐ,
<Dropdown>์ปดํฌ๋ํธ์props.children์๋<Dropdown.Trigger />์<Dropdown.Item />์ด ๋ค์ด๊ฐ๋ค. ์ฆ,Dropdown์ปดํฌ๋ํธ ์์์ ์ดchildren์ ๋ ๋๋งํด์ฃผ๋ฉด ๊ทธ ์์ ๋ด์ฉ์ด ํ๋ฉด์ ๋ํ๋๋ค.
<Dropdown.Trigger /> // โ
<Dropdown.Item>ํธ์ด์ด์ด</Dropdown.Item> // โ
์๋ํ๋ฉด ๋ด๋ถ์์ useContext(DropdownContext)๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๋ฐ๋์ <Dropdown> ์์ ์์ด์ผ ์ ์ ๋์ํ๋ค.
Headless๋ UI๋ฅผ ์ ๊ณตํ์ง ์๊ณ , ์ค์ง ๋ก์ง๊ณผ ์ํ๋ง ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋งํ๋ค.
function useToggle() {
const [on, setOn] = useState(false);
const toggle = () => setOn((prev) => !prev);
return { on, toggle };
}
์ด๊ฑด ๋ก์ง๋ง ๋ด๊ธด ํ ์ด๋ค. UI๋ ๋ณ๋๋ก ๋ง๋ค๊ณ , ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ ์ ์๋ค!
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| Compound Component | ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ฒด์ฒ๋ผ ๊ตฌ์ฑํ์ฌ ํ์ ์ปดํฌ๋ํธ๋ฅผ ์์ฑ์ผ๋ก ๋ถ์ |
| ์ฅ์ | ์ฌ์ฌ์ฉ์ฑ, ์ํ ๊ณต์ , ๊ฐ๋ ์ฑ, ์ ์ฐ์ฑ ํฅ์ |
| ํต์ฌ ๊ธฐ์ | Context API + JS์ ํจ์๋ ๊ฐ์ฒด๋ผ๋ ์ฑ์ง |
| Headless | ๋ก์ง๊ณผ UI ๋ถ๋ฆฌ, ์ปค์คํฐ๋ง์ด์ง์ ๊ฐํจ |
| children | ๋ถ๋ชจ ์ปดํฌ๋ํธ ์์์ ์์ ์ปดํฌ๋ํธ๋ฅผ ์ ์ฐํ๊ฒ ๋ ๋๋งํ๊ฒ ํด์ฃผ๋ ํน๋ณํ prop |
Compound Components๋ ์ํ ๊ณต์ ๊ฐ ํ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋ ๊ฐ๋ ฅํ ํจํด์ด๋ค.