React, Next, Redux/⚛ React.JS

커스텀 Hoc 만들기

DarrenKwonDev 2020. 6. 17. 23:30

주로 HOC 의 이름을 만들땐 with_____ 형식으로 짓습니다. react-route-dom의 withRouter도 Hoc의 일종이기 때문에 이렇게 이름을 붙인 것입니다.

 

우리는 웹요청을 하는 HOC 를 만들테니 withRequest 라고 지어주도록 하겠습니다.

 

HOC은 그냥 원소로 컴포넌트를 받는 컴포넌트입니다. 어떤 로직을 거친 후에 원소로 받은 컴포넌트를 리턴해주면 됩니다.

import React, { Component } from 'react';

const withRequest = (url) => (WrappedComponen) => {
  return class extends Component {

    state = {
      data: null
    }

    async initialize() {
      try {
        const response = await axios.get(url);
        this.setState({
          data: response.data
        });
      } catch (e) {
        console.log(e);
      }
    }

    componentDidMount() {
      this.initialize();
    }

    render() {
      const { data } = this.state;
      return (
        <WrappedComponent {...this.props} data={data}/>
      )
    }
  }
}

export default withRequest;

 

어떤 컴포넌트를 활용할 때 이 HOC으로 감싸주면 됩니다.

react-router-dom의 withRouter도 감싸주면 props가 자동으로 생겼는데 이러한 처리를 거쳤기 때문에 생긴 것으로 볼 수 있습니다.

import React, { Component } from 'react';
import withRequest from './withRequest';

class Post extends Component {
  render() {
    const { data } = this.props;
    
    if (!data) return null;

    return (
      <div>
        { JSON.stringify(this.props.data) }    
      </div>
    );
  }
}


export default withRequest('https://jsonplaceholder.typicode.com/posts/1')(Post);

 

 

 

참고)

 

컴포넌트에 날개를 달아줘, 리액트 Higher-order Component (HoC) | VELOPERT.LOG

리액트 Higher-order Component (HOC) 코드를 작성하다보면, 자주 반복해서 작성하게 되는 코드들이 있습니다. 우리는 주로 그러한 것들을 함수화하여 재사용 하곤 하죠. 컴포넌트 또한 비슷하죠. 같은 U

velopert.com