Presetational and Container Component Pattern
데이터 처리와 데이터 출력을 분리하는 패턴.
-
Container Components
-
컨테이너 컴포넌트에서는 주로 데이터 fetch가 이루어짐
-
연관이 있는 서브 컴포넌트를 렌더링.
-
DOM Markup, 스타일이 없음
-
상태 유지 성향을 가지고 있음
import React, { useState, useEffect } from 'react'; import List From './List'; const ListContainer = () => () let [itemList, setList] = useState(); useEffect = (() => { ... }, []); return <List items = {itemList}/> }
-
-
Presentational Components
-
화면에 보여지는 것들을 담당하는 Components. (DOM marckup, style)
-
Props를 통해서 데이터나 callback을 받아 올 수 있다.
-
뷰에 필요한 state를 가지고 있을 수 있다.
-
상태 유지가 없는 성향.
import React from 'react'; const List = itmes => { <> <ul> {itmes.map(({body, author}) => ( <li> {body} - {aution} </li> ))} </ul> </> }
-
이 패턴으로 컴포넌트를 작성하면 작업을 하는 앱과 UI를 이해하기 쉽게 만들 수 있다.
같은 UI를 사용할 수 있기 때문에 다른 상태를 나타내는 컨테이너를 만들어서 재사용할 수 있다.
똑같은 마크업 형식을 여러 컨테이너에 작성하는 작업을 피할 수 있다.
Atomic Design Pattern
디자인 요소들을 나누어 파악하고 이 요소들이 조합되는 과정을 통해서 디자인을 구성하는 방식
Atoms -> Molecules -> Organisms -> Templates -> Pages
- Atoms
하나의 구성 요소. 본인 자체의 스타일만 가지고 있으며 다른 곳에 영향을 미치는 스타일은 적용되지 않아야 한다. 원자는 Form labels, inputs, buttons와 같은 basic html elements를 포함.
const Button = ({ type = 'button', children = ''}) => (
<button type={type}>{children}</button>
)
- Molecules
Atoms가 모여서 만들어지는 하나의 구성 요소.
Atom 단위인 input label, input, buttom를 합쳐 새로운 의미있는 단위를 만든다. 실제로 동작할 수 있게 됨.
- Organisms : 분자들의 모음
Organisms (유기체)는 분자들의 모음으로 복잡한 구조를 가지고 있다. 서로 동일하거나 다른 molecules (분자)로 구성될 수 있다.
Organisms는 로고, 검색, 채널리스트와 같은 다양한 컴포넌트 (molecules)로 구성될 수 있다.
- Templates : 유기체들을 모아 템플릿으로 생성, 스타일링에 집중한 단위
페이지의 최종 내용보다는 페이지의 기본 내용 구조에 초점을 맞춘다.
- Pages : 실제 페이지를 구성
실제 대표적인 콘텐츠가 배치된 UI의 모습을 보여주는 템플릿의 특정 인스턴스.
Pages 단위에서 어플리케이션 상태 관리가 이루어져야 한다.
Higher-Order Components (HOC)
컴포넌트를 매개변수로 받아 새로운 컴포넌트를 리턴해 주는 Javascript Function.
컴포넌트의 로직을 재사용하길 원할 때 유용.
파라미터로 컴포넌트를 받아오고 함수 내부에서 새 컴포넌트를 만든 다음에 해당 컴포넌트에서 파라미터로 받아온 컴포넌트를 렌더링하는 것.
with____ 로 파일명 작성
import React, { Component } from 'react';
const withRequest = (url) => (WrappedComponent) => {
return class extends Component {
render() {
return (
<WrappedComponent {...this.props}/>
)
}
}
}
export default withRequest;
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://url')(Post);
컴포넌트를 내보낼 때 사용하면 된다.