κ°œμš” πŸ‘‹

이번 ν¬μŠ€νŒ…μ—μ„œλŠ” ν”„λ‘ νŠΈμ—”λ“œ ν¬μ§€μ…˜μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ”
React ν”„λ ˆμž„μ›Œν¬μ™€ μ•ˆμ •μ„±μ„ μœ„ν•΄ μ‚¬μš©ν•˜λŠ” TypeScript λ₯Ό μ‚¬μš©ν•˜μ—¬
κ°„λ‹¨ν•œ μ»΄ν¬λ„ŒνŠΈλ₯Ό κ΅¬ν˜„ν•΄λ³΄κ³ μžν•œλ‹€.


What is FC ?

FC λŠ” Function Component 의 μ•½μžλ‘œ,
React 의 ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©λ˜λŠ” νƒ€μž…μ΄λ‹€.
이 νƒ€μž…μ€ ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈκ°€ 받을 수 μžˆλŠ” props 의 νƒ€μž…μ„ μ œλ„€λ¦­μœΌλ‘œ λ°›μ•„, νƒ€μž… μ•ˆμ •μ„±μ„ 높일 수 μžˆλ‹€.

기본적으둜 React.FC λŠ”,
children μ΄λΌλŠ” props λ₯Ό μžλ™μœΌλ‘œ μΆ”κ°€ν•œλ‹€.

// 1
type ComponentsType = React.FC<MyProps>;

// 2
type ComponentsType = (
  props: Myprops & { children?: ReactNode }
) => ReactElement;

두 μ½”λ“œλŠ” 같은 의미λ₯Ό 가지고 μžˆλŠ” μ½”λ“œμ΄λ‹€.


μž₯점

React.FC 의 μž₯점은
μ»΄ν¬λ„ŒνŠΈκ°€ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμž„μ„ λͺ…μ‹œν•˜μ—¬ 보닀 μ§κ΄€μ μœΌλ‘œ 확인할 수 있으며,

ν˜‘μ—… μ‹œ ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλ₯Ό κ³΅μœ ν•œλ‹€λ©΄,
props 에 μ–΄λ–€ 값이 μ „λ‹¬λ˜λŠ”μ§€ μ‰½κ²Œ νŒŒμ•…μ΄ κ°€λŠ₯ν•˜λ‹€.

μžλ™μœΌλ‘œ children μ΄λΌλŠ” ν”„λ‘œνΌν‹°λ₯Ό 받을 수 μžˆμœΌλ―€λ‘œ,
λ³„λ„λ‘œ children 을 νƒ€μž… μ •μ˜μ— μΆ”κ°€ν•  ν•„μš”κ°€ μ—†λ‹€.

λ˜ν•œ props 에 λŒ€ν•œ νƒ€μž…μ„ λͺ…μ‹œν•  수 μžˆμ–΄,
잘λͺ»λœ νƒ€μž…μ˜ props λ₯Ό μ „λ‹¬ν•˜λŠ” μ‹€μˆ˜λ₯Ό 컴파일 νƒ€μž„μ— 디버깅 ν•  수 μžˆλ‹€.

단점

λ°˜λ©΄μ— λ‹¨μ μœΌλ‘œλŠ”,
defaultProps 와 ν˜Έν™˜μ΄ λ˜μ§€ μ•Šμ„ 수 있고,
children 을 μžλ™μœΌλ‘œ μΆ”κ°€ν•˜κΈ°μ—
children 을 받지 μ•Šμ•„μ•Ό ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ³„λ„μ˜ νƒ€μž…μ„ μ§€μ •ν•˜μ—¬ μ‚¬μš©ν•΄μ•Όν•œλ‹€.

defaultProps λŠ” 클래슀 μ»΄ν¬λ„ŒνŠΈμ—μ„œ 주둜 μ‚¬μš©ν•¨.
children 을 받지 μ•Šμ•„μ•Ό ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” React.FC λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  직접 props νƒ€μž…μ„ λͺ…μ‹œν•΄μ€€λ‹€.

즉, Optional Children.
말 κ·ΈλŒ€λ‘œ Children 을 μ˜΅μ…”λ„ν•˜κ²Œ 가지고 μžˆλ‹€λŠ” 것이닀.

export const Hello: React.FC<HelloProps> = ({ name }) => {
  return <h1>Hello olleh! my name is {name}</h1>;
};

const App = () => (
  <>
    <Hello name="suzi">
      <span>{"I have children"}</span>
    </Hello>
  </>
);

μœ„ μ½”λ“œλ₯Ό 보면,
Hello μ»΄ν¬λ„ŒνŠΈλŠ” children 을 λ Œλ”λ§ ν•˜λŠ” 뢀뢄이 μ—†μŒμ—λ„
App μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ—λŸ¬ 없이 μž‘λ™ν•œλ‹€.

μ΄λŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ ν˜Όλž€μ„ μ•ΌκΈ°ν•  수 μžˆλŠ” λΆ€λΆ„μ΄λ―€λ‘œ,
ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈμ— children 의 μ‘΄μž¬κ°€ κ°€λŠ₯ν•œμ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” 둜직이 μΆ”κ°€λ˜λ©΄
가독성, μœ μ§€λ³΄μˆ˜ μΈ‘λ©΄μ—μ„œ 쒋을 것 κ°™λ‹€.


defaultProps κ°€ ν˜Έν™˜μ΄ λ˜μ§€ μ•ŠλŠ”λ‹€ λΌλŠ” 말은,
즉, React.FC μ—μ„œλŠ” defaultProps λ₯Ό μ‚¬μš©ν•˜μ§€ λͺ»ν•œλ‹€ λΌλŠ” 말 이닀.

defaultProps λž€ -> props 의 default 값을 μ„€μ •ν•΄μ£ΌλŠ” 방법이닀.

export const Hello: React.FC<HelloProps> = ({ name }) => {
  return <h1>Hello olleh! my name is {name}</h1>;
};

Hello.defaultProps = {
  name: "minsu",
};
export const Hello: FC<HelloProps> = ({ name = "minsu" }) => {
  return <h1>Hello olleh! my name is {name}</h1>;
};

두 μ½”λ“œμ˜ μ˜ˆμ‹œκ°€ μžˆλ‹€.
첫 번째 μ½”λ“œμ˜ 경우 defaultProps 속성을 μ‚¬μš©ν•˜μ—¬ 기본값을 μ§€μ •ν•΄μ£Όκ³ μžˆλ‹€.
name 에 props κ°€ μ „λ‹¬λ˜μ§€ μ•Šμ„ 경우 default 둜 μ •μ˜ν•œ β€˜minsu’ κ°€ κΈ°λ³Έκ°’μœΌλ‘œ μ‚¬μš©λœλ‹€.

두 번째 μ½”λ“œμ˜ 경우,
ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ νŒŒλΌλ―Έν„°μ—μ„œ 직접 기본값을 μ„€μ •ν•˜κ³ μžˆλ‹€.
name 에 props κ°€ μ „λ‹¬λ˜μ§€ μ•Šμ„ 경우 직접 κΈ°λ³Έκ°’μœΌλ‘œ μ§€μ •ν•œ β€˜minsu’ κ°€ κΈ°λ³Έκ°’μœΌλ‘œ μ‚¬μš©λœλ‹€.

두 μ½”λ“œμ˜ μ°¨μ΄μ μœΌλ‘œλŠ”

  1. defaultProps 기본값을 μ •μ˜ν•˜λŠ” 섀정이 ν•„μš” μ—†λŠ” 두 번째 μ½”λ“œκ°€
    보닀 κ°„κ²°ν•˜μ—¬ 가독성을 ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.
  2. TypeScript λ₯Ό μ‚¬μš© ν•  경우 λ‘λ²ˆμ§Έ μ½”λ“œκ°€ νƒ€μž… 좔둠에 보닀 μœ λ¦¬ν•  수 μžˆλ‹€.
    기본값이 λͺ…μ‹œμ μœΌλ‘œ λ§€κ°œλ³€μˆ˜μ— μ§€μ •λ˜μ—ˆκΈ° λ•Œλ¬Έμ— TypeScript κ°€ 더 μ •ν™•ν•œ νƒ€μž… 좔둠이 κ°€λŠ₯ν•˜λ‹€.

React μ—μ„œ defaultProps λŠ” λ―Έλž˜μ— deprecated 될 κ°€λŠ₯성이 μžˆμœΌλ―€λ‘œ,
두 번째 방식이 더 μ•ˆμ „ν•œ λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ”λ° 쒋을 것 κ°™λ‹€.


FC μ˜ˆμ‹œ πŸ’Ύ

import React, { FC } from "react";

interface MyProps {
  name: string;
  age: number;
}

const MyComponent: FC<MyProps> = ({ name, age, children }) => {
  return (
    <div>
      <p>Name: {name}</p>
      <p>Age: {age}</p>
      <div>{children}</div>
    </div>
  );
};

export default MyComponent;

ν•΄λ‹Ή μ˜ˆμ‹œμ˜ μ½”λ“œλŠ” MyProps λΌλŠ” TypeScript μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•˜κ³ ,
name μ΄λΌλŠ” λ¬Έμžμ—΄ νƒ€μž…κ³Ό,
age λΌλŠ” 숫자 νƒ€μž…μ˜ ν”„λ‘œνΌν‹°λ₯Ό 가진닀.

MyComponent λΌλŠ” μ΄λ¦„μœΌλ‘œ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ (FC) μž„μ„ λͺ…μ‹œν•˜κ³ ,
MyProps μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ”°λ₯΄λŠ” props λ₯Ό λ°›λŠ”λ‹€.

FC<MyProps λ₯Ό μ‚¬μš©ν•˜λ©΄ children μ΄λΌλŠ” props 도 μžλ™μœΌλ‘œ ν¬ν•¨λœλ‹€.


Reference 🌊

https://shape-coding.tistory.com/entry/TypeScript-ReactFC%EC%97%90-%EC%82%AC%EC%9A%A9%EC%97%90-%EB%8C%80%ED%95%B4-%EC%83%9D%EA%B0%81%ED%95%B4%EB%B3%B4%EA%B8%B0
https://story.pxd.co.kr/1650
https://velog.io/@apro_xo/React-React.FC%EC%9D%98-%EB%8B%A8%EC%A0%90%EA%B3%BC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95