component의 props
디자인 패턴을 알아보자
<Component
className="foo"
title="component prpos design"
external
>
<span> children </span>
</Component>
// props 객체
"props": {
"className": "foo",
"title": "component props design"
"external": true,
"children": '<span> children </span>, // react element 요소
}
컴포넌트로 전달된 props
객체를 전개(spread) 하여 컴포넌트의 내부의 구조에 모두 추가할 수 있다.
<Component {...props} />
다만, props
객체의 소성을 전개하였을 때 사용된 external
과 같은 비 표준 속성은 오류를 발생 시킴
이런 경우 컴포넌트로 전달된
props
에서 비 표준 속성을 걸러내어 문제를 해결 할 수 있다.// 구조 분해 할당 + 나머지 연산 const { external, children, ...restProps } = props; // 전개 연산 <Component {...restProps}> {children} </Component>
propTypes를 사용하여 컴포넌트에 전달된 props
를 검사
props
전개 코드의 순서에 따라 기존 속성을 덮어쓰거나, 전달된 속성이 덮어써지는 문제가 발생
이러한 문제를 해결하려면 컴포넌트 내부에서 조건 처리 하거나, classnames 라이브러리를 활용
import classNames from 'classnames'; const { external, children, className, ...restProps } = props; const combineClassNames = classNames('originalClassName', className);
컴포넌트 내부의 DOM 노드 중 특정 노드를 외부에서 변경할 수 있도록 처리하는데 사용되는 속성 (tag
라는 이름으로도 사용됨)
// as: DOM 노드의 태그 이름
const { as: Component, ...domProps } = props;
// as의 vlaue값인 Compoennt로 바뀜 (required props)
<Component {...domProps} />
필요한 경우 컴포넌트의 전달 속성인 props
객체의 속성 중 일부에 기본값을 설정 가능
Component.defaultProps = {
prop1: 'defaultValue'
}
컴포넌트에 호출 될 함수형 렌더(render)props
를 전달하여 컴포넌트 내부에서 렌더링 되도록 설정
React 컴포넌트 속성으로 React 요소를 반환하는 함수를 전달
컴포넌트 내부에서 렌더링 되도록 설정하는 것
const renderProps = ({ onOpen }) => (
<button
type="button"
className="modal__openButton"
>
Modal 열기
</button>
);
// trigger 속성으로 렌더링(호출) 될 함수를 전달
<Modal trigger={renderProps}>
<Modal.Header>
Modal Label
</Modal.Header>
<Modal.Contents>
Modal Contents
</Modal.Contents>
</Modal>
하나의 컴포넌트를 호출하여 다음과 같이 복합적으로 컴포넌트를 사용할 수 있도록 구성한다.
return (
<Modal>
<Modal.Header>
Modal Label
</Modal.Header>
<Modal.Contents>
Modal Contents
</Modal.Contents>
</Modal>
)
컴파운드(복합) 컴포넌트를 활용하여 컴포넌트의 상태 또는 메서드(또는 핸들러) 등을 효과적으로 공유하기 위해 컨텍스트(Context)를 사용할 수 있습니다. Modal 상위 컴포넌트에서 컨텍스트 공급자(Provider)를 통해 데이터를 공급하고, Modal.Header(또는 Modal.Contents) 하위 컴포넌트에서 컨텍스트 수요자(Consumer 또는 contextType, useContext 훅 활용)를 활용해 데이터를 수요할 수 있습니다.
import React, {createContext} from 'react';
// Modal 컨텍스트 생성
const ModalContext = createContext();
// 컴포넌트 간 공유할 데이터 설정
<ModalContext.Provider value={{
/* ... */
}}/>
// 방법 1. 컨텍스트 수요자 활용
<ModalContext.Consumer>
{(context) => {/* JSX */}}
</ModalContext.Consumer>
// 방법 2. 클래스 컴포넌트: contextType
static contextType = ModalContext;
// 방법 3. 함수형 컴포넌트: useContext 훅
const context = useContext(ModalCOntext);