๐ก Ref: render๋ฉ์๋์์ ์์ฑ๋ DOM ๋ ธ๋๋ React ์๋ฆฌ๋จผํธ์ ์ ๊ทผํ๋ ๋ฐฉ์์ ์ ๊ณตํ๋ ๊ฐ
function FancyButton(props) {
return (
<button className="FancyButton">
{props.children}
</button>);
}
์ผ๋ฐ์ ์ธ ์ปดํฌ๋ํธ๋ DOM ์์์ ์ง์ ์์กดํ ์ผ์ด ์์ง๋ง, ๋ฐ๋จ์ ์ฌ์ฌ์ฉ์ฑ ๋์ ์์๋ค์ ์ง์ ์์กดํด์ผ ํ ์ผ์ด ์๊ธด๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ref๋ฅผ ์ด๋ค.
Ref ์ ๋ฌํ๊ธฐ๋ ์ผ๋ถ ์ปดํฌ๋ํธ๊ฐ ์์ ํ ref๋ฅผ ๋ฐ์ ์กฐ๊ธ ๋ ์๋๋ก ์ ๋ฌํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค.
์๋์ ์์์ย FancyButton
์ย React.forwardRef
๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฌ๋ย ref
๋ฅผ ์ป๊ณ , ๊ทธ๊ฒ์ ๋ ๋๋ง ๋๋ DOMย button
์ผ๋ก ์ ๋ฌํ๋ค.
const FancyButton = React.forwardRef((props, ref) => (
<button ref={ref} className="FancyButton">
{props.children}
</button>
));
// ์ด์ DOM ๋ฒํผ์ผ๋ก ref๋ฅผ ์์ ๋ฐ์ ์ ์์ต๋๋ค.
const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>;
์ด๋ฐ ๋ฐฉ๋ฒ์ DOM๋ ธ๋์ ๋ํ ์ง์ ์ ์ธ ์ ๊ทผ์ ํ ์ ์๋ค.
๐ก ์์๋๊ธฐ
ref
์ ๋ํ ์ ๊ทผ์React.forwardRef()
ํธ์ถ์ ํตํด์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ์ผ๋ฐ ํจ์๋ ํด๋์ค ์ปดํฌ๋ํธ์์๋ props๋กref
๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ค. Ref์ ๋ฌ์ DOM ์ปดํฌ๋ํธ์๋ง ํ์ ์ ์ด์ง ์๊ณ ์ผ๋ฐ์ ์ธ ํด๋์ค ์ปดํฌ๋ํธ ์ธ์คํด์ค์๋ ์ ๋ฌํ ์ ์๋ค.
๋ณด๋ฅ
์ด ๊ธฐ์ ์ ๊ณ ์ฐจ์ ์ปดํฌ๋ํธ์์ ์ ์ฉํ ์ ์๋ค. ์ฝ์์ ์ปดํฌ๋ํธ props๋ฅผ ๋ก๊น ํ๋ HOC์์๋ฅผ ๋ณด์.
function logProps(WrappedComponent) {
class LogProps extends React.Component {
componentDidUpdate(prevProps) {
console.log('old props:', prevProps);
console.log('new props:', this.props);
}
render() {
return <WrappedComponent {...this.props} />;
}
}
return LogProps;
}
logProps HOC๋ ๋ชจ๋ props
๋ฅผ ๋ํํ๋ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๋ค.
class FancyButton extends React.Component {
focus() {
// ...
}
// ...
}
// FancyButton์ ๋ด๋ณด๋ด๋ ๋์ LogProps๋ฅผ ๋ด๋ณด๋
๋๋ค.
// ๊ทธ๋๋ FancyButton์ ๋ ๋๋งํฉ๋๋ค.
export default logProps(FancyButton);
์ ์์ ์์ ๋ฌธ์ ๋ ref
๋ props๋ก ์ ๋ฌ๋์ง ์๋ ๊ฒ์ด๋ค. ์ด์ ๋ ref
๋ props๊ฐ ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
HOC์ ref๋ฅผ ์ถ๊ฐํ๋ฉด ref๋ ๋ํ๋ ์ปดํฌ๋ํธ๊ฐ ์๋๋ผ ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ ์ปจํ ์ด๋ ์ปดํฌ๋ํธ๋ฅผ ์ฐธ์กฐํ๋ค.