--- name: script-setup description: Compile-time syntactic sugar for Composition API in SFCs --- # Script Setup ` ``` ## Benefits - Less boilerplate (no `export default`, no `return`) - TypeScript type inference - Better runtime performance - Better IDE support ## Top-Level Bindings All top-level bindings are automatically available in template: ```vue ``` ## Compiler Macros These are available without import: - `defineProps()` - declare props - `defineEmits()` - declare emits - `defineModel()` - declare v-model (3.4+) - `defineExpose()` - expose public instance properties - `defineOptions()` - declare component options (3.3+) - `defineSlots()` - type slot props (3.3+) - `withDefaults()` - provide prop defaults ## Using Components Import and use directly without registration: ```vue ``` ### Dynamic Components ```vue ``` ### Recursive Components SFCs can reference themselves by filename: ```vue ``` ## Custom Directives Variables starting with `v` are available as directives: ```vue ``` ## defineExpose() Components are closed by default. Use `defineExpose` to expose properties: ```vue ``` Parent can access via template ref: ```ts const childRef = ref() childRef.value.count // accessible childRef.value.publicMethod() // accessible ``` ## defineOptions() (3.3+) Declare component options without separate ` ``` ## defineSlots() (3.3+) Type slot props for IDE support: ```vue ``` ## useSlots() & useAttrs() Access slots and attrs in script: ```vue ``` ## Top-Level await Async setup with Suspense: ```vue ``` > Note: Requires `` boundary in parent. ## Generic Components (TypeScript) ```vue ``` Multiple generics with constraints: ```vue ``` ## Alongside Normal Script For advanced cases like named exports or one-time side effects: ```vue ```