# Vue Component Patterns Reference
## Table of Contents
- [Props Definition](#props-definition)
- [Emits Definition](#emits-definition)
- [V-Model Bindings](#v-model-bindings)
- [Template Patterns](#template-patterns)
- [Component Naming](#component-naming)
- [V-Model Modifiers](#v-model-modifiers)
## Props Definition
```vue
```
**Rules:**
- ALWAYS use TypeScript generics: `defineProps<{ }>()`
- Use `const props =` ONLY if props referenced in script block
- NEVER use runtime validation (`type`, `required`, `PropType`) when TypeScript available
- Destructure ONLY for default values
## Emits Definition
```vue
```
**Rules:**
- ALWAYS use `const emit = defineEmits<{ }>()`
- ALWAYS define event payload types: `eventName: [arg1: type, arg2: type]` or `eventName: []`
- ALWAYS use camelCase in script, kebab-case in templates
- Use semantic event names: `submit`, `delete`, `userUpdated` (not generic `update`)
## V-Model Bindings
```vue
```
**Rules:**
- ALWAYS use `defineModel()` for v-model bindings
- NEVER manually define `modelValue` prop + `update:modelValue` emit
- Use named models for multiple bindings: `defineModel('name')`
- defineModel handles all prop/emit wiring automatically
## Template Patterns
```vue
Title
Content
...
Content
```
**Rules:**
- Use `:propName` when value variable matches prop name (instead of `:propName="propName"`)
- ALWAYS use explicit `` tags for ALL slots
- ALWAYS use shorthand: `#slotName` instead of `v-slot:slotName`
- Use kebab-case for props/events in templates, camelCase in script
## Component Naming
```
✅ CORRECT:
src/components/
UserProfile.vue (PascalCase)
SearchButtonClear.vue (General → Specific)
✅ ALSO CORRECT:
src/components/
user-profile.vue (kebab-case)
search-button-clear.vue
❌ WRONG:
ClearSearchButton.vue (Specific → General)
userProfile.vue (camelCase)
```
**Rules:**
- File names: PascalCase OR kebab-case (be consistent in project)
- Component names in script: ALWAYS PascalCase
- Compose names from general to specific: `SearchButtonClear` not `ClearSearchButton`
## V-Model Modifiers
For custom modifiers, fetch the official docs:
Basic pattern:
```vue
```