# 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 ``` **Rules:** - Use `:propName` when value variable matches prop name (instead of `:propName="propName"`) - ALWAYS use explicit `