Next
Next
Next.js
TypeScript
redux, recoil
등을 이용하여 전역적으로 상태를 관리할 때도 있지만, 전연적으로 관리하는 상태값을 제외하곤drilling
이 일어나지 않는 선에서props
를 간편하게 사용한다.typescript
를 사용할 때는 전달되는props
의 데이터 타입도 올바르게 지정을 해줘야 하는데, 자세한 개념을 모르고 사용은 해왔으나, 개념에 대해 추가적으로 작성해보고자 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function ParentExample(){
const [data, setData] = useState<ExampleType>();
useEffect(() => {
axios.get("/data").then(res => setData(res.data)).catch(err => console.log(err));
}, [])
return(
<Container>
<ChildExample props={props}/>
</Container>
)
}
function ChildExample(/*여기서 props를 사용*/){
const {example1, example2} = props;
return (
<div>{example1.data}</div>
)
};
- 위와 같은 형식으로 자식 컴포넌트에서 부모 컴포넌트에게
props
를 전달받는다고 가정한다. - 이때,
props
에 대한 데이터 타입을 지정해줘야 하는데, 타입 지정 방법으로 검색했을 때 나오는 일반적인 지정 방법은 아래와 같다.
1
function ChildExample({ props }: { props: ExampleArray }) {}
- 이렇게 지정되는 타입에 대해 잘 모르고 사용해왔고, 이에 대한 추가 설명은 이러하다.
- 만약
props
로 전달받는 데이터가example1,example2
라는 키를 갖고 있는 객체라고 한다면, 키를 가진 객체에 대한 타입을 직접 명시하는 방법을 사용할 수 있다.
1
function ChildExample({ example1, example2 }: ExampleArray) {}
- 흔히 할 수 있는 실수가 객체를 그대로 넘겨받을 것을 생각하여
(prop: ExampleArray){}
라고 작성한다면,prop
라는 키를 가진 데이터를 특정 짓는 것과 같다. - 위 방법을 사용하고자 한다면 데이터를 모두 넘겨줄 때
spread
연산자를 사용하여, 넘어오는 데이터 자체에 대한 타입을 규정해주어야 한다.
1
2
3
<ChildExample {...props} />;
function ChildExample(props: ExampleArray) {}
- 또 다른 방법은 가지고 있는 데이터를 모두 풀어서 작성하는 것이다.
1
2
3
4
<ChildExample {...props}/> // 가능
<ChildExample example1={props.example1} example2={props.example2}/>
function ChildExample({example1, example2}:ExampleArray){}
- 작성된 형태를 보면
props
전부를 넘겨주어 이 안의 데이터를 구조분해할당하여 따로 사용하느냐,spread
문법으로 넘겨준 모든 데이터를 사용하느냐, 형태를 유지하며 데이터를 직접적으로 명시하여 사용하느냐 등의 차이이지만 근본은 같다.