Skip to content

Component Naming and Design ​

10.2.1. File Names ​

TargetConventionExample
Component filesPascalCaseUserProfile.vue
Composable filescamelCase, use prefixuseUser.ts
Store filescamelCase, use prefixuseUserStore.ts
UtilitiescamelCaseformatDate.ts
Type definitionscamelCaseuser.ts

10.2.2. Component Usage ​

When using components in templates, PascalCase must be used.

vue
<!-- Correct -->
<UserProfile :user="currentUser" />

<!-- Incorrect -->
<user-profile :user="currentUser" />

10.2.3. Props Definition ​

  • Props must have their types specified in defineProps.
  • Use withDefaults when default values are needed.
  • Props names must be defined in 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 Definition ​

  • Emits must have event signatures specified in defineEmits.
  • Event names must use camelCase.
  • Payload types must be explicitly defined.
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. Slot Patterns ​

  • Default slots are used for layout components.
  • Named slots are used for composite layouts.
  • Scoped slots are used for data delegation patterns.
vue
<!-- Layout component -->
<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