diff --git a/blog/functionaschildren/index.mdx b/blog/functionaschildren/index.mdx index 366a537..49eb488 100644 --- a/blog/functionaschildren/index.mdx +++ b/blog/functionaschildren/index.mdx @@ -1,5 +1,5 @@ --- -title: "Child 컴포넌트에게 props 전달하는 법" +title: "Child 컴포넌트에게 props 전달하는 법과 HOC(2024.09.22 업데이트)" date: "2024-06-24" slug: "function-as-child-component" tags: ["React"] @@ -31,12 +31,99 @@ Context를 쓰거나 React.cloneElement()를 쓰거나 하는 답변이 있었 HOC는 횡단 관심사를 묶어서 컴포넌트의 공통된 처리를 위함이었다. 그러나 이러한 공통 처리는 굳이 컴포넌트 자체를 래핑할 필요없이 hooks를 통해 처리할 수 있게 되었다. -또한 HOC는 컴포넌트들을 조합 및 합성하여 새로운 컴포넌트를 만들어낼 수 있다는 장점이 있었다. 그러나 이러한 장점은 글을 읽어보니 function as child 패턴으로 대체할 수 있었다. 그렇게 hoc 패턴은 -점차 잊혀진 패턴이 되어가고 있는듯하다. 이제 막 대학교 4학년 때, 처음 react를 +또한 HOC는 컴포넌트들을 조합 및 합성하여 새로운 컴포넌트를 만들어낼 수 있다는 장점이 있었다. +그러나 이러한 장점은 글을 읽어보니 function as child 패턴으로 대체할 수 있다는 생각이 들었다. + +예를 들면 이런 식이다.(2024.09.22 업데이트 내용) + +아래 소스는 인프런의 '[리액트 2부] 고급 주제와 훅' 강의를 듣다가 참고한 코드인데 HOC 패턴을 사용하여 로깅을 하는 예시이다. + +```javascript +const withLogging = (WrappedComponent) => { + function log(message) { + console.log(`${getComponentName(WrappedComponent)} ${message}`); + } + class WithLogging extends React.Component { + render() { + const enhancedProps = { + log, + }; + return ; + } + componentDidMount() { + log(); + } + } + + return WithLogging; +}; + +class Header extends React.Component { + render() { + return
헤더
; + } +} +class Button extends React.Component { + handleClick = () => { + this.props.log("[버튼] 클릭"); + }; + render() { + return ; + } +} + +const EnhancedHeader = withLogging(Header); +const EnhancedButton = withLogging(Button); +``` + +그런데 충분히 이런 소스도 렌더 프롭을 이용하여 구현할 수 있다는 생각이 들어 작업해보았다. + +```javascript +const Logging = ({ children }) => { + function log() { + const wrappedComponent = + typeof children === "function" ? children() : children; + console.log(getComponentName(wrappedComponent.type())); + } + + React.useEffect(() => { + log(); + }, []); + + return typeof children === "function" ? children({ log }) : children; +}; + +const Header = () => { + return
헤더
; +}; +const Button = (props) => { + return ( + + ); +}; + +const EnhancedHeader = () => ( + +
+ +); + +const EnhancedButton = () => { + return {(props) =>