๐Ÿ’ก Ref: render๋ฉ”์†Œ๋“œ์—์„œ ์ƒ์„ฑ๋œ DOM ๋…ธ๋“œ๋‚˜ React ์—˜๋ฆฌ๋จผํŠธ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ

DOM์— refs ์ „๋‹ฌํ•˜๊ธฐ

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 ์ปดํฌ๋„ŒํŠธ์—๋งŒ ํ•œ์ •์ ์ด์ง€ ์•Š๊ณ  ์ผ๋ฐ˜์ ์ธ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค์—๋„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.


์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ์ง€๊ด€๋ฆฌ์ž๋ฅผ ์œ„ํ•œ ์ฃผ์˜์‚ฌํ•ญ

๋ณด๋ฅ˜


๊ณ ์ฐจ์› ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ ref ์ „๋‹ฌํ•˜๊ธฐ

์ด ๊ธฐ์ˆ ์€ ๊ณ ์ฐจ์› ์ปดํฌ๋„ŒํŠธ์—์„œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ˜์†”์— ์ปดํฌ๋„ŒํŠธ 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๋Š” ๋ž˜ํ•‘๋œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.