일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- http 413
- Intellij
- 배포 파이프라인
- intellij ide
- 오블완
- Infra
- elasticsearch
- 디자인패턴
- 윈도우키보드
- GoF
- golang
- 대규모 시스템 설계
- 사설 ip
- m4 pro
- goland
- go
- kube-prometheus-stack
- apollo router
- cosine similarity metric
- AWS
- 배포 프로세스
- Kubernetes
- Buffered channel
- Logrus
- gitops
- body size
- notification system
- 코사인 유사성 메트릭스
- 티스토리챌린지
- UnBuffered channel
Archives
- Today
- Total
Fall in IT.
React HoC 개념과 간단 사용방법 본문
반응형
React HoC(Higher-order Component)란?
- 리액트 컴포넌트를 인자로 받아서 다른 리액트 컴포넌트를 반환하는 함수를 고차함수라고 한다.
- 조금 더 자세히 설명하면, HoC의 원리는 파라미터로 컴포넌트를 받고, 함수 내부에서 새 컴포넌트를 만든 다음에 해당 컴포넌트 안에서 파라미터로 받아온 컴포넌트를 렌더링 하는 것이다.
React HoC는 언제 사용할까?
- 리액트 컴포넌트를 작성하게 될 때 반복될 수 있는 코드들을 HoC를 만들어서 해결할 수 있다.
코드
- 예를들어, 중복되는 HTTP 요청 코드가 존재할때 HoC를 사용하여 중복되는 코드를 제거할 수 있다.
- Github에 전체코드를 확인해보세요.
NewPost.tsx
import React from 'react';
import withRequest from "../components/withRequest";
interface PostIProps
{
data: string;
};
class Post extends React.Component< PostIProps >
{
public render(): JSX.Element
{
const {data} = this.props;
return (
< div >
{JSON.stringify(data)}
< /div >
)
}
}
export default withRequest('https://jsonplaceholder.typicode.com/posts/1')(Post);
NewComments.tsx
import React from 'react';
import withRequest from "../components/withRequest";
interface CommentsIProps
{
data: string;
};
class Comments extends React.Component< CommentsIProps >
{
public render(): JSX.Element
{
const {data} = this.props;
return (
< div >
{JSON.stringify(data)}
< /div >
)
}
}
export default withRequest('https://jsonplaceholder.typicode.com/comments?postId=1')(Comments);
withRequest.tsx - HTTP Request를 대신할 HoC, 고차함수
import React from 'react';
import axios from 'axios';
const withRequest = (url: string) => (WrappedComponent: React.ComponentType< any >) =>
{
return class extends React.Component
{
public state =
{
data: null
};
public componentDidMount(): void
{
this.initialize();
}
private async initialize()
{
try
{
const response = await axios.get(url);
this.setState({
data: response.data
});
}
catch (error)
{
console.log(error);
}
}
public render(): JSX.Element
{
const {data} = this.state;
if (!data)
return < div >로딩중< /div >;
return < WrappedComponent {...this.props} data={data} / >;
}
}
};
export default withRequest;
App.tsx - Component를 화면에 보여줄 Container Component
import React from 'react';
import './App.css';
import NewPost from "./pages/NewPost";
import NewComments from "./pages/NewComments";
class App extends React.Component
{
public render(): JSX.Element
{
return (
< div >
Post
< br / >
< NewPost />
< hr/ >
Comments
< br />< br />
< NewComments / >
< /div >
)
}
}
export default App;
참조
반응형
'프레임워크 > React' 카테고리의 다른 글
리액트 컴포넌트를 절대경로로 임포트하는 방법 (0) | 2020.04.06 |
---|---|
[React/lodash] React에서 debounce 간단 사용방법 (2) | 2020.03.31 |
Create-react-app에서 Moment.js Locale이 적용되지 않는 문제 (2) | 2020.03.14 |
리액트 CRA 프로젝트에서 PORT 변경하는 방법 (0) | 2020.02.01 |
React Error Target container is not a DOM element (0) | 2019.05.17 |
Comments