Props 정의

https://ko.vuejs.org/guide/components/props

Composition API

//1.문자열 배열로 선언

<script setup> 
const props = defineProps(['foo'])
console.log(props.foo)
</script>

//2. 객체 리터럴로 선언

<script setup> 
defineProps({
  title: String,
  likes: Number
})
</script>

//3. 타입스트립트 제네릭으로 선언
<script setup lang="ts">
defineProps<{
  title?: string
  likes?: number
}>()
</script>

⬆️ Props 타입스크립트 정의

타입스크립트를 사용하면, Props의 정의법이 달라진다. 예를들어서


//TypeScript 미사용

const props = defineProps({
  pageNubmers: {
    type: Array<number>;
    default: [];
  };
  startNum: {
    type: number;
    default: 1;
  };
  totalPage: {
    type: number;
    default: 0;
  };
  href: {
    type: string;
    default: "/";
  };
}();

타입스크립트를 사용하지 않을때 Props는 위와 같이 객체 형태로 값들을 선언하고 기본값도 할당해줄 수 있다. type이라는 프로퍼티를 명시해 어떤 타입인지도 지정해 사용할 수도 있음.

위와같이 선언하면, 템플릿 내에서는 반응형 객체들이 .value 없이도 사용할 수 있는 것 처럼, 그냥 프로퍼티 이름으로 값을 사용할 수 있다.

하지만 타입스크립트를 적용하면서 위와같이 기본값까지 할당하려면 다른 방법을 사용해야 한다. 타입스크립트 타입 체커를 이용하면서 위와같이 선언하면 : 오른쪽의 객체가 타입으로 인식되기 때문이다!

image.png

따라서 그냥 사용하려면 해당 타입이 number가 아니라는 오류가 난다. 이때는

Vue.js

interface props {
  pageNumber: Array<number>;
  startNum: number;
  totalPage: number;
  href: string;
}

const props = withDefaults(defineProps<props>(), {
  pageNumber: () => [],
  startNum: 1,
  totalPage: 1,
  href: "",
});

이렇게 인터페이스를 사용하고, 이를 통해 props의 타입을 명시하되, 기본값을 주고 싶다면 withDefaults 라는 메서드를 따로 이용한다! 이 메서드의 두번째 인자로 전달되는 객체가 props의 프로퍼티의 기본값이 된다.

Props 사용(부모 컴포넌트)