-
[React] JSX.Element vs ReactNode vs ReactElementReact 2022. 10. 8. 21:11
1. 전반적인 구조
ts에서 주로 children component를 props를 넘길때, 자주 사용하는 type 종류와 차이에 대해 알아보겠다.
자주 사용했던, JSX.Element, ReactNode, ReactElement가 있는데 이들의 관계는 간단하게 아래 사진과 같다.
[사전 지식]
1) 클래스형 컴포넌트는 render 메소드에서 ReactNode를 리턴
2) 함수형 컴포넌트는 ReactElement를 리턴
3) jsx로 작성된 코드를 babel을 통해 자바스크립트로 변환을 하면, React.createElement()로 나타낸다.
변환 전)const example = () => { return <div>hello, world</div> }
변환 후)
const example = () => { return /*#__PURE__*/React.createElement("div", null, "hello, world"); }; // type, key, props
이때, React.createElement로 반환되는 타입이 ReactElement와 JSX.Element이다.
2. ReactNode
type ReactNode = ReactElement | string | number | ReactFragment | ReactPortal | boolean | null | undefined;
- ReactNode는 render() 메소드를 통해서 반환되는 값이며, render()를 사용하는 class component의 반환값은 ReactNode인 것이다.
- ReactNode는 위의 코드에서 알 수 있듯 ReactElement와 함께, string, number, boolean, null, undefined 등 자바스크립트 내에서 모든 요소의 타입을 포함하고 있다. 그렇기 때문에, 어떤 props가 올지 모를경우, ReactNode로 지정하면 좋다
3. ReactElement
interface ReactElement<P = any, T extends string | JSXElementConstructor<any> = string | JSXElementConstructor<any>> { type: T; props: P; key: Key | null; }
- 함수형 컴포넌트는 ReactElement를 반환한다.
- type, props를 가지는 타입.
4. JSX.Element
declare global { namespace JSX { interface Element extends React.ReactElement<any, any> { } ... } }
- JSX.Element는 ReactElement의 props와 type이 둘다 any로, ReactElement에 any로 제네릭한 형태로 보면 된다.
'React' 카테고리의 다른 글
[React] React 컴포넌트 설계 패턴 (0) 2023.04.15 [React] React.memo vs useMemo vs useCallback (0) 2022.10.22 [React] HOC(high order component)의 개념과 사용법 (0) 2022.08.30