HOC
- 앱 전반적으로 재사용 가능한 로직을 prop으로 컴포넌트에게 제공함
- ex) 컴포넌트 스타일 시트 설정, 권한 요청, 전역 상태 추가 등
- 고차 컴포넌트: 다른 컴포넌트를 받는 컴포넌트
- Composing
- 여러 HOC 조합
- HOC 사용하는 유명 오픈소스 라이브러리 -> recompose
- 몇몇 상황에서는 Hooks로 대체 가능
- 일반적으로 React의 훅은 HOC 패턴을 완전 대체할 수 없음
- 대부분의 경우에서 React의 훅은 트리가 깊어지는 상황을 줄일 수 있음
- 훅은 컴포넌트 내부에서 특정한 동작을 추가할 수 있게 해주지만, HOC에 비해 버그 발생 확률 높음
- HOC 여러번 조합해서 사용하면 모든 prop이 안에서 병합되므로
어떤 HOC가 어떤 props에 관련 있는지 파악하기 어려움 -> 앱의 디버깅이나 규모를 키울 때 방해될 수 있음
- 예시
// DogImages.js
import React from "react";
import withLoader from "./withLoader";
import withHover from "./withHover";
function DogImages(props) {
return (
<div {...props}>
{props.hovering && <div id="hover">Hovering!</div>}
<div id="list">
{props.data.message.map((dog, index) => (
<img src={dog} alt="Dog" key={index} />
))}
</div>
</div>
);
}
export default withHover(
withLoader(DogImages, "https://dog.ceo/api/breed/labrador/images/random/6")
);
// withLoader.js
import React, { useEffect, useState } from "react";
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();
}, []);
if (!data) {
return <div>Loading...</div>;
}
return <Element {...props} data={data} />;
};
}
// withHover.js
import React, { useState } from "react";
export default function withHover(Element) {
return props => {
const [hovering, setHover] = useState(false);
return (
<Element
{...props}
hovering={hovering}
onMouseEnter={() => setHover(true)}
onMouseLeave={() => setHover(false)}
/>
);
};
}
- 활용
반응형
'Personal-Study > UI Component Patterns' 카테고리의 다른 글
[UI Component] Design Patterns - Hooks (0) | 2023.11.06 |
---|---|
[UI Component] Design Patterns - Render Props (0) | 2023.11.06 |
[UI Component] Design Patterns - Mixin (0) | 2023.11.01 |
[UI Component] Design Patterns - Module (0) | 2023.10.31 |
[UI Component] Design Patterns - Container/Presentational (0) | 2023.10.24 |
댓글