[Typescript] React.FC λ ? π¨
κ°μ π
μ΄λ² ν¬μ€ν
μμλ νλ‘ νΈμλ ν¬μ§μ
μμ κ°μ₯ λ§μ΄ μ¬μ©νλ
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β κ° κΈ°λ³Έκ°μΌλ‘ μ¬μ©λλ€.
λ μ½λμ μ°¨μ΄μ μΌλ‘λ
defaultProps
κΈ°λ³Έκ°μ μ μνλ μ€μ μ΄ νμ μλ λ λ²μ§Έ μ½λκ°
λ³΄λ€ κ°κ²°νμ¬ κ°λ μ±μ ν₯μμν¬ μ μλ€.- 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