React์ cloneElement๋ฅผ ํ์ฉํ์ฌ ํจ์จ์ ์ธ ์๋ฆฌ๋จผํธ ์์ , ๋์ UI ์์ฑ, ํฅ์๋ ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ฑ์ ๋ฌ์ฑํ์ธ์. ์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ณด์ธ์.
React cloneElement: ๋์ UI๋ฅผ ์ํ ์๋ฆฌ๋จผํธ ์์ ๋ง์คํฐํ๊ธฐ
React.cloneElement
๋ React ๊ฐ๋ฐ์์ ๋ฌด๊ธฐ๊ณ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค. ์ด๋ฅผ ํตํด ๊ธฐ์กด ์๋ฆฌ๋จผํธ๋ฅผ ์ง์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์ props์ ์์์ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ์ฌ ๊ธฐ์กด ์๋ฆฌ๋จผํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด React ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ถ๋ณ์ฑ์ React์ ํต์ฌ ์์น์ด๋ฉฐ ์์ธก ๊ฐ๋ฅํ๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ฝ๋์ ๊ธฐ์ฌํฉ๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋์์๋ cloneElement
์ ๋ณต์ก์ฑ์ ํํค์น๊ณ ์ฌ์ฉ ์ฌ๋ก, ์ด์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํ์ํฉ๋๋ค.
React ์๋ฆฌ๋จผํธ์ ์ปดํฌ๋ํธ ์ดํดํ๊ธฐ
cloneElement
์ ๋ํด ์์๋ณด๊ธฐ ์ ์ React ์๋ฆฌ๋จผํธ์ ์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ ๊ฐ๋
์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
React ์๋ฆฌ๋จผํธ: React ์๋ฆฌ๋จผํธ๋ ํ๋ฉด์ ํ์ํ๋ ค๋ ๋ด์ฉ์ ์ค๋ช ํ๋ ์ผ๋ฐ JavaScript ๊ฐ์ฒด์ ๋๋ค. ๊ฐ๋ณ๊ณ ๋ถ๋ณํฉ๋๋ค. ์ค์ DOM ๋ ธ๋์ ์ฒญ์ฌ์ง์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
React ์ปดํฌ๋ํธ: React ์ปดํฌ๋ํธ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ๋ ๋ฆฝ์ ์ธ UI ๋จ์์ ๋๋ค. ํจ์ํ ์ปดํฌ๋ํธ(๋จ์ JavaScript ํจ์) ๋๋ ํด๋์ค ์ปดํฌ๋ํธ(์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ์๋ JavaScript ํด๋์ค)๊ฐ ๋ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ๋ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ ๋๋งํ๊ณ , React๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ DOM์ ์ ๋ฐ์ดํธํฉ๋๋ค.
cloneElement
๋ React ์๋ฆฌ๋จผํธ์ ์์ฉํ์ฌ ๋ ๋๋ง๋๊ธฐ ์ ์ ์ด๋ฌํ ์ฒญ์ฌ์ง์ ์์ ํ ์ ์๋๋ก ํฉ๋๋ค.
React.cloneElement๋ ๋ฌด์์ธ๊ฐ?
React.cloneElement(element, props, ...children)
๋ ์ ๊ณต๋ element
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด React ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ์ฌ ๋ฐํํฉ๋๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ณธ ์๋ฆฌ๋จผํธ๋ฅผ ๋ณต์ ํ์ง๋ง, props๋ฅผ ์ฌ์ ์ํ๊ณ ์๋ก์ด ์์์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๊ธฐ์ตํด์ผ ํ ์ฃผ์ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๋ณธ ์๋ฆฌ๋จผํธ๋ฅผ ์์ ํ์ง ์์ต๋๋ค.
- ์๋ก์ด React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํฉ๋๋ค.
- ์๋ก์ด props๋ฅผ ์๋ณธ ์๋ฆฌ๋จผํธ์ props์ ๋ณํฉํฉ๋๋ค. ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์๋ก์ด props๊ฐ ์ฐ์ ํฉ๋๋ค.
- ๋ณต์ ๋ ์๋ฆฌ๋จผํธ์ ์๋ก์ด ์์์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๊ตฌ๋ฌธ ๋ถ์:
๊ตฌ๋ฌธ์ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค:
React.cloneElement(element, props, ...children)
element
: ๋ณต์ ํ๋ ค๋ React ์๋ฆฌ๋จผํธ์ ๋๋ค.props
: ์ถ๊ฐํ๊ฑฐ๋ ์ฌ์ ์ํ๋ ค๋ ์๋ก์ด props๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด์ ๋๋ค....children
: ๋ณต์ ๋ ์๋ฆฌ๋จผํธ์ ์ถ๊ฐํ ์ ํ์ ์์์ ๋๋ค.props.children
์ ๋ช ์์ ์ผ๋ก ํฌํจํ์ง ์๋ ํ ๊ธฐ์กด ์์์ ๋์ฒดํฉ๋๋ค.
React.cloneElement์ ์ฌ์ฉ ์ฌ๋ก
cloneElement
๋ ๋ค์๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค์์ ํนํ ์ ์ฉํฉ๋๋ค:
- ์์ ์ปดํฌ๋ํธ์ props ์์ : ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฒํผ ์ปดํฌ๋ํธ๊ฐ ์๊ณ , ์ปจํ
์คํธ์ ๋ฐ๋ผ
onClick
ํธ๋ค๋ฌ๋ ์คํ์ผ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๊ณ ์์ํด ๋ณด์ธ์. - ๊ธฐ์กด ์ปดํฌ๋ํธ์ ๋ํผ(wrapper) ์ถ๊ฐ: ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ด๋ ์คํ์ผ๋ง์ ์ ๊ณตํ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)๋ก ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ๊ณ ์ถ์ ์ ์์ต๋๋ค.
- ๋์ ๋ ์ด์์ ์์ฑ:
cloneElement
๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด ํฌ๊ธฐ๋ ๋ค๋ฅธ ์์ธ์ ๋ฐ๋ผ ์ปดํฌ๋ํธ์ ๋ ์ด์์์ด๋ ์คํ์ผ์ ์กฐ์ ํ ์ ์์ต๋๋ค. - Prop Drilling ๋์ (์ฃผ์ ํ์): ํน์ ์๋๋ฆฌ์ค์์ ๊ณผ๋ํ prop drilling์ ํผํ๊ธฐ ์ํด ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
cloneElement์ ์ค์ฉ์ ์ธ ์์
cloneElement
๊ฐ ์ด๋ป๊ฒ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋์ง ๋ณด์ฌ์ฃผ๋ ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์ 1: ๋ฒํผ Props ์์ ํ๊ธฐ
๊ฐ๋จํ ๋ฒํผ ์ปดํฌ๋ํธ๋ฅผ ์๊ฐํด ๋ด ์๋ค:
function MyButton(props) {
return ;
}
์ด์ , ๋ค๋ฅธ onClick
ํธ๋ค๋ฌ์ ์ถ๊ฐ์ ์ธ ์คํ์ผ๋ง์ผ๋ก ์ด ๋ฒํผ์ ์์ ๋ ๋ฒ์ ์ ๋ง๋ค๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค:
import React from 'react';
function MyButton(props) {
return ;
}
function App() {
const handleClick = () => {
alert('๋ฒํผ์ด ํด๋ฆญ๋์์ต๋๋ค!');
};
const buttonStyle = {
backgroundColor: 'lightblue',
padding: '10px',
border: 'none',
borderRadius: '5px',
cursor: 'pointer',
};
return (
console.log('์๋ณธ ๋ฒํผ ํด๋ฆญ๋จ')}>์๋ณธ ๋ฒํผ
{React.cloneElement(
๋ณต์ ๋ ๋ฒํผ ,
{
onClick: handleClick,
style: buttonStyle
}
)}
);
}
export default App;
์ด ์์ ์์ cloneElement
๋ ์ง์ ๋ onClick
ํธ๋ค๋ฌ์ style
์ ์ฌ์ฉํ์ฌ ์๋ก์ด ๋ฒํผ ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ์ฌ ์๋ณธ ๋ฒํผ์ ์์ฑ์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ ์ํฉ๋๋ค. ๋ณต์ ๋ ๋ฒํผ์ ํ๋์ ๋ฐฐ๊ฒฝ, ๋ฅ๊ทผ ๋ชจ์๋ฆฌ ๋ฐ ๋ค๋ฅธ ํด๋ฆญ ๋์์ผ๋ก ํ์๋ฉ๋๋ค.
์์ 2: ๋ํผ ์ปดํฌ๋ํธ ์ถ๊ฐํ๊ธฐ
ํจ๋ฉ์ ์ถ๊ฐํ๋ div๋ก ๊ฐ์ธ๊ณ ์ถ์ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค:
function MyComponent() {
return ์ด๊ฒ์ ๋ด ์ปดํฌ๋ํธ์
๋๋ค.
;
}
cloneElement
๋ฅผ ์ฌ์ฉํ์ฌ ๋ํผ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค:
import React from 'react';
function MyComponent() {
return ์ด๊ฒ์ ๋ด ์ปดํฌ๋ํธ์
๋๋ค.
;
}
function App() {
const wrapperStyle = {
padding: '20px',
border: '1px solid black'
};
return (
{React.cloneElement(
,
{
style: wrapperStyle,
children: (
)
}
)}
);
}
export default App;
์ฐธ๊ณ : ์ด ์์ ๋ ๊ธฐ๋ฅ์ ๋ณด์ฌ์ฃผ์ง๋ง ๋ํผ๋ฅผ ์ถ๊ฐํ๋ ์ด์์ ์ธ ๋ฐฉ๋ฒ์ ์๋๋๋ค. ๋๋ถ๋ถ์ ์ํฉ์์๋ ์ ์ฉ ๋ํผ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.
์์ 3: ์กฐ๊ฑด๋ถ Prop ์์
๋ค์์ cloneElement
๋ฅผ ์ฌ์ฉํ์ฌ props๋ฅผ ์กฐ๊ฑด๋ถ๋ก ์์ ํ๋ ๋ฐฉ๋ฒ์ ์์
๋๋ค. ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฒํผ์ ๋นํ์ฑํํ๋ ค๋ ์๋๋ฆฌ์ค๋ฅผ ์์ํด ๋ณด์ธ์.
import React, { useState } from 'react';
function MyButton(props) {
return ;
}
function App() {
const [isDisabled, setIsDisabled] = useState(false);
const toggleDisabled = () => {
setIsDisabled(!isDisabled);
};
return (
alert('ํด๋ฆญ๋จ!')} disabled={isDisabled}>ํด๋ฆญํ์ธ์
);
}
export default App;
์์ 4: ์์(Children) ๋ค๋ฃจ๊ธฐ
cloneElement
๋ ์ปดํฌ๋ํธ์ ์์์ ๋ค๋ฃฐ ๋ ๊ฐ๋ ฅํฉ๋๋ค. ํญ๋ชฉ ๋ชฉ๋ก์ ๋ ๋๋งํ๋ ์ปดํฌ๋ํธ๊ฐ ์๊ณ ๊ฐ ํญ๋ชฉ์ ํน์ prop์ ์ถ๊ฐํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค.
import React from 'react';
function ListItem(props) {
return {props.children} ;
}
function MyList(props) {
return (
{React.Children.map(props.children, child => {
return React.cloneElement(child, {
style: { color: 'blue' }
});
})}
);
}
function App() {
return (
์์ดํ
1
์์ดํ
2
์์ดํ
3
);
}
export default App;
์ด ์์ ์์ React.Children.map
์ MyList
์ปดํฌ๋ํธ์ ์์๋ค์ ์ํํฉ๋๋ค. ๊ฐ ์์(ListItem
)์ ๋ํด cloneElement
๋ฅผ ์ฌ์ฉํ์ฌ style
prop์ ์ถ๊ฐํ๊ณ ํ
์คํธ ์์์ ํ๋์์ผ๋ก ์ค์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ๋ชจ๋ ์์์๊ฒ ์คํ์ผ๋ง์ด๋ ๋ค๋ฅธ ์์ ์ ์ฝ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
cloneElement ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
cloneElement
๋ ์ ์ฉํ ๋๊ตฌ์ด์ง๋ง, ์ฝ๋๋ฅผ ์ง๋์น๊ฒ ๋ณต์กํ๊ฒ ๋ง๋ค์ง ์๋๋ก ์ ์คํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์์ ๋ช
์ฌํด์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก์
๋๋ค:
- ๋๋ฌผ๊ฒ ์ฌ์ฉํ๊ธฐ:
cloneElement
๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฝ๊ณ ์ดํดํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๊ฐ ๋ ์ ์์ต๋๋ค. prop drilling์ด๋ context์ ๊ฐ์ ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด ๋ ์ ์ ํ๋ค๋ฉด ๊ณ ๋ คํด ๋ณด์ธ์. - ๊ฐ๋จํ๊ฒ ์ ์งํ๊ธฐ:
cloneElement
ํธ์ถ ๋ด์ ๋ณต์กํ ๋ก์ง์ ํผํ์ธ์. ๋ณต์กํ ์กฐ์์ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ ์ ์ฉ ์ปดํฌ๋ํธ๋ ํฌํผ ํจ์๋ฅผ ๋ง๋๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. - ํค(key) ์ฌ์ฉํ๊ธฐ: ๋ฃจํ๋ map ํจ์ ๋ด์์ ์๋ฆฌ๋จผํธ๋ฅผ ๋ณต์ ํ ๋ ๊ฐ ๋ณต์ ๋ ์๋ฆฌ๋จผํธ์ ๊ณ ์ ํ
key
prop์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์ด๋ React๊ฐ DOM์ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. - ์ฝ๋ ๋ฌธ์ํํ๊ธฐ: ๋ค๋ฅธ ์ฌ๋๋ค(๊ทธ๋ฆฌ๊ณ ์์ )์ด ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์ฝ๋์์
cloneElement
์ ๋ชฉ์ ๊ณผ ์ฌ์ฉ๋ฒ์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ธ์. - ๋์ ๊ณ ๋ คํ๊ธฐ: ๋๋ก๋ render props๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด
cloneElement
๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๊นจ๋ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์๋ฃจ์ ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
cloneElement์ ๋์
cloneElement
๋ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ง๋ง, ๋ค๋ฅธ ํจํด๋ค๋ ์ ์ฌ์ ์ผ๋ก ๋ ๋์ ์ ์ง ๊ด๋ฆฌ์ฑ๊ณผ ๊ฐ๋
์ฑ์ผ๋ก ์ ์ฌํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค:
- Render Props: ์ด ํจํด์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋งํ๋ ๋ฐ ์ฌ์ฉํ๋ ํจ์๋ฅผ prop์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์ ๋ ๋๋ง์ ์ ์ดํ ์ ์์ต๋๋ค.
- ๊ณ ์ฐจ ์ปดํฌ๋ํธ (HOCs): HOC๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฐ์์ ์๋กญ๊ณ ํฅ์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ ํจ์์ ๋๋ค. ์ด๋ ์ธ์ฆ์ด๋ ๋ก๊น ๊ณผ ๊ฐ์ ๊ณตํต ๊ด์ฌ์ฌ๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
- Context API: React์ Context API๋ ํธ๋ฆฌ์ ๋ชจ๋ ๋ ๋ฒจ์ ํตํด ๋ช ์์ ์ผ๋ก prop์ ์ ๋ฌํ์ง ์๊ณ ๋ ํ ๋ง๋ ์ฌ์ฉ์ ์ธ์ฆ ์ธ๋ถ ์ ๋ณด์ ๊ฐ์ ๊ฐ์ ์ปดํฌ๋ํธ ๊ฐ์ ๊ณต์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ์ด๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ
cloneElement
๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ํจ์ ์ ์ดํดํด์ผ ํฉ๋๋ค:
- ์์ ์ ๋ฌ์ ์๋ ๊ฒฝ์ฐ: ์๋ฆฌ๋จผํธ๋ฅผ ๋ณต์ ํ ๋ ์์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์. ์๋ณธ ์์์ ๋ช ์์ ์ผ๋ก ์ ๋ฌํ๊ฑฐ๋ ์๋ก์ด ์์์ ์ ๊ณตํ์ง ์์ผ๋ฉด ์์์ ์์ค๋ฉ๋๋ค.
- Prop ์ถฉ๋:
cloneElement
์ ์ ๋ฌ๋ ์๋ก์ด props๊ฐ ์๋ณธ props์ ์ถฉ๋ํ ๋, ์๋ก์ด props๊ฐ ํญ์ ์๋ณธ์ ์ฌ์ ์ํฉ๋๋ค. ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ํผํ๊ธฐ ์ํด ์ด ๋์์ ์ ์ํ์ธ์. - ์ฑ๋ฅ ๋ฌธ์ : ํนํ ์์ฃผ ์
๋ฐ์ดํธ๋๋ ์ปดํฌ๋ํธ์์
cloneElement
๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ํด๊ฒฐํ์ธ์.
cloneElement์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง (SSR)
cloneElement
๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)๊ณผ ์ํํ๊ฒ ์๋ํฉ๋๋ค. React ์๋ฆฌ๋จผํธ๋ ๋จ์ง JavaScript ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์๋ฒ์์ ์ฝ๊ฒ ์ง๋ ฌํํ๊ณ ๋ ๋๋งํ ์ ์์ต๋๋ค.
๊ตญ์ ํ ๊ณ ๋ ค ์ฌํญ
๊ตญ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ์์
ํ ๋ cloneElement
๊ฐ ํ
์คํธ ๋ฐ ๊ธฐํ ๋ก์ผ์ผ๋ณ ์์ฑ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ ์๋์ง ๊ณ ๋ คํ์ธ์. ํ์ฌ ๋ก์ผ์ผ์ ๋ฐ๋ผ props๋ฅผ ์กฐ์ ํด์ผ ํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์์ ์ธ์ด์ ๋ฐ๋ผ ์ ๊ทผ์ฑ์ ์ํด aria-label
์์ฑ์ ๋์ ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค.
์ ๊ทผ์ฑ ๊ณ ๋ ค ์ฌํญ
cloneElement
๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฆฌ๋จผํธ๋ฅผ ์์ ํ ๋ ์๋์น ์๊ฒ ์ ๊ทผ์ฑ์ ํด์น์ง ์๋๋ก ํ์ธ์. ์๋ก์ด ์๋ฆฌ๋จผํธ๊ฐ ์ ์ ํ ARIA ์์ฑ๊ณผ ์๋งจํฑ HTML์ ์ ์งํ๋์ง ํ์ธํ์ธ์. ์๋ฅผ ๋ค์ด, ๋์ ์ผ๋ก ๋ฒํผ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ฅผ ์ํด ์ ์ ํ aria-label
์ด๋ aria-describedby
์์ฑ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
๊ฒฐ๋ก
React.cloneElement
๋ React ์๋ฆฌ๋จผํธ๋ฅผ ์กฐ์ํ๊ณ ๋์ UI๋ฅผ ๋ง๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค. ๊ทธ ๊ธฐ๋ฅ๊ณผ ํ๊ณ๋ฅผ ์ดํดํจ์ผ๋ก์จ ๋ ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ํ์ฉํ ์ ์์ต๋๋ค. ์ ์คํ๊ฒ ์ฌ์ฉํ๊ณ , ๋์ ํจํด์ ๊ณ ๋ คํ๋ฉฐ, ํญ์ ์ฝ๋์ ๋ช
ํ์ฑ๊ณผ ์ฑ๋ฅ์ ์ฐ์ ์ํด์ผ ํ๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์.
cloneElement
๋ฅผ ๋ง์คํฐํจ์ผ๋ก์จ React ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํ ์๋ก์ด ์ฐจ์์ ์ ์ด๋ ฅ์ ํ๋ณดํ๊ณ ์ง์ ์ผ๋ก ๋์ ์ด๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค.