Coding-Village-Protector / woowahan-ts

[우아한 타입스크립트 with 리액트] 북 스터디 📚
14 stars 2 forks source link

8.1.5_`ReactElement`, `ReactNode`, `JSX.Element`에 대해서 간단하게 설명해주세요. #23

Closed lulla-by closed 8 months ago

lulla-by commented 8 months ago

📝 p255

ReactElement, ReactNode, JSX.Element는 모두 리액트의 요소를 나타내는 타입입니다. 이 세가지 타입의 차이점과 어떤 상황에서 각 타입을 사용하는지 간략하게 적어주세요.

Stilllee commented 8 months ago

ReactElement

요약하자면, ReactElement는 컴포넌트를 직접 생성할 때 사용되며, ReactNode는 다양한 타입의 데이터를 처리할 때 사용됩니다. JSX.Elementrender props 패턴을 사용할 때 유용합니다.

eeeyooon commented 8 months ago

1. ReactElement

ReactElement는 React 요소를 나타내는 인터페이스입니다. React 요소는 React 컴포넌트의 가장 작은 단위로, 화면에 렌더링 될 수 있는 것을 의미합니다. ReactElement는 주로 React 컴포넌트의 반환 타입으로 사용됩니다. 예를 들어, 함수형 컴포넌트나 클래스 컴포넌트에서 render 메서드는 ReactElement를 반환합니다.

const MyComponent: React.FC = (): React.ReactElement => {
  return <div>Hello World</div>;
};


2. ReactNode

ReactNode는 ReactElement보다 더 넓은 범위의 타입입니다. ReactNode는 ReactElement, 문자열, 숫자, 배열, fragment, boolean 등을 포함할 수 있습니다. 즉, React 컴포넌트가 반환할 수 있는 거의 모든 것을 포함합니다. ReactNode는 컴포넌트가 다양한 타입의 자식을 반환할 수 있을 때 사용됩니다.

const MyComponent: React.FC = (): React.ReactNode => {
  return <div>{someCondition ? "Text" : <OtherComponent />}</div>;
};


3. JSX.Element

JSX.Element는 TypeScript가 JSX를 사용할 때 정의하는 타입입니다. 이는 기본적으로 ReactElement와 동일하지만, JSX 문법을 사용하는 경우에 한해 적용됩니다. 주로 JSX 문법을 사용하는 함수나 컴포넌트의 반환 타입으로 사용됩니다.

const MyComponent = (): JSX.Element => {
  return <div>Hello World</div>;
};


📝 사용 예시

sryung1225 commented 8 months ago

React.ReactNode

React.ReactElement

JSX.Element

lulla-by commented 8 months ago

리액트는 ReactElement 객체를 읽어서 DOM을 구성하며, ReactElement는 createElement 메서드 호출로 생성된 리액트 엘리먼트를 나타내는 타입입니다. ReactElement 주로 React의 내부 동작을 다루거나 추론 관점에서 JSX.Element 대신 더 유용하게 활용하고 싶을 때 ReactElement를 사용합니다.

JSX.Element 는 React.ReactElement를 확장하고 있는 타입이며 이러한 특성으로 컴포넌트 타입을 재정의 하거나 변경하는 것이 용이합니다. JSX.Element는 리액트 엘리먼트를 prop으로 전달받아 render props 패턴으로 컴포넌트를 구현할 때 유용하게 사용합니다.

ReactNode는 리액트의 render 함수가 반환할 수 있는 모든 형태를 담고 있습니다. ReactNode는 render함수가 반환할 수 있는 모든 형태를 담고 있기 때문에 리액트 컴포넌트가 가질 수 있는 모든 타입을 의미합니다. 이런 특성상 주로 children의 타입을 명시할때 주로 사용되며 prop으로 리액트 컴포넌트가 다양한 형태를 가질 수 있도록 만드는 경우 사용합니다.