Skip to content

컴포넌트 네이밍 및 설계

10.2.1. 파일명

대상규칙예시
컴포넌트 파일PascalCaseUserProfile.vue
Composable 파일camelCase, use 접두사useUser.ts
Store 파일camelCase, use 접두사useUserStore.ts
유틸리티camelCaseformatDate.ts
타입 정의camelCaseuser.ts

10.2.2. 컴포넌트 사용

템플릿에서 컴포넌트를 사용할 때는 PascalCase를 사용합니다.

vue
<!-- 올바른 예 -->
<UserProfile :user="currentUser" />

<!-- 잘못된 예 -->
<user-profile :user="currentUser" />

10.2.3. Props 정의

  • Props는 defineProps에 타입을 명시합니다.
  • 기본값이 필요한 경우 withDefaults를 사용합니다.
  • Props 이름은 camelCase로 정의합니다.
vue
<script setup lang="ts">
interface Props {
  title: string
  count?: number
  items?: string[]
}

const props = withDefaults(defineProps<Props>(), {
  count: 0,
  items: () => [],
})
</script>

10.2.4. Emits 정의

  • Emits는 defineEmits에 이벤트 시그니처를 명시합니다.
  • 이벤트 이름은 camelCase를 사용합니다.
  • 페이로드 타입을 명확히 정의합니다.
vue
<script setup lang="ts">
const emit = defineEmits<{
  update: [value: string]
  delete: [id: number]
  submit: [data: FormData]
}>()

function handleSubmit(data: FormData) {
  emit('submit', data)
}
</script>

10.2.5. 슬롯 패턴

  • 기본 슬롯은 레이아웃 컴포넌트에 사용합니다.
  • 이름 있는 슬롯(Named Slot)은 복합 레이아웃에 사용합니다.
  • 범위 슬롯(Scoped Slot)은 데이터 위임 패턴에 사용합니다.
vue
<!-- 레이아웃 컴포넌트 -->
<template>
  <div class="card">
    <div class="card-header">
      <slot name="header" />
    </div>
    <div class="card-body">
      <slot />
    </div>
    <div class="card-footer">
      <slot name="footer" />
    </div>
  </div>
</template>

TIENIPIA QUALIFIED STANDARD