# Component Patterns ## Props Best Practices - Type your props: `defineProps<{msg: string, count?: number}>()` - Required props have no `?`—TypeScript enforces - Default values: `withDefaults(defineProps(), {count: 0})` - Props are readonly—never mutate, emit event to parent instead ## Emit Patterns - Type your emits: `defineEmits<{(e: 'update', value: string): void}>()` - Emit returns boolean if event handler returns false - Vue 3.3+ shorthand: `defineEmits<{update: [value: string]}>()` - Always emit for changes—maintain one-way data flow ## v-model Patterns - `v-model` = `:modelValue` + `@update:modelValue` - Multiple v-model: `v-model:title`, `v-model:content`—different props - `defineModel()` (3.4+) creates ref that syncs automatically—much simpler - v-model modifiers: `.trim`, `.number`, `.lazy`—access via `modelModifiers` ## Slots Patterns - Default slot: ``—or `fallback content` - Named slots: `` + `