HOC 패턴

종종 여러 컴포넌트에서 같은 로직을 사용해야 하는 경우가 있다. 이런 로직은 컴포넌트의 스타일시트를 설정하는 것일 수 있고, 권한을 요청하거나, 전역 상태를 추가하는 것일 수 있다.

같은 로직을 여러 컴포넌트에서 재사용하는 방법 중 하나로 고차 컴포넌트 패턴을 활용하는 방법이 있다. 이 패턴은 앱 전반적으로 재사용 가능한 로직을 여러 컴포넌트들이 쓸 수 있게 해 준다.

HOC 패턴에 대해 공부해보자.

고차 컴포넌트 소개

고차 컴포넌트 만들기 (1)

function withStyles(Component) {
  return props => {
    const style = { padding: '0.2rem', margin: '1rem' }
    return <Component style={style} {...props} />
  }
}

const Button = () = <button>Click me!</button>
const Text = () => <p>Hello World!</p>

const StyledButton = withStyles(Button)
const StyledText = withStyles(Text)

고차 컴포넌트 만들기 (2)

import React, { useEffect, useState } from "react";

// withLoader는 Element(컴포넌트)와 url(데이터를 불러올 주소)을 인자로 받고,
// 데이터 로딩 로직을 담은 새로운 컴포넌트를 반환하는 HOC이다.
export default function withLoader(Element, url) {
  return (props) => {
    const [data, setData] = useState(null);

    useEffect(() => {
      async function getData() {
        const res = await fetch(url);
        const data = await res.json();
        setData(data);
      }

      getData();
    }, [url]);

    // 데이터가 아직 로딩 중이라면 로딩 메시지를 표시
    if (!data) {
      return <div>Loading...</div>;
    }

    // 데이터 로딩이 완료되면, 원래의 Element 컴포넌트에 data를 props로 넘겨 렌더링
    return <Element {...props} data={data} />;
  };
}

끝!