<script setup> â
<script setup>
āĻšāϞ āϏāĻŋāĻā§āĻā§āϞ-āĻĢāĻžāĻāϞ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāϏ (SFCs) āĻāϰ āĻŽāϧā§āϝ⧠āĻāĻŽā§āĻĒā§āĻāĻŋāĻļāύā§āϰ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒāĻžāĻāϞ-āĻāĻžāĻāĻŽ āϏāĻŋāύāĻā§āϝāĻžāĻāĻāĻŋāĻ āϏā§āĻāĻžāϰāĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ SFCs āĻāĻŦāĻ Composition API āĻāĻāϝāĻŧāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ āϤāĻŦā§ āĻāĻāĻŋ āϰāĻŋāĻā§āĻŽā§āύā§āĻĄā§āĻĄ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏāĨ¤ āĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ <script>
āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏā§āϰ āϤā§āϞāύāĻžāϝāĻŧ āĻ
āύā§āĻ āϏā§āĻŦāĻŋāϧāĻž āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§:
- āϞā§āϏ āĻŦāϝāĻŧāϞāĻžāϰāĻĒā§āϞā§āĻ āϏāĻš āĻāϰāĻ āϏāĻāĻā§āώāĻŋāĻĒā§āϤ āĻā§āĻĄ
- āĻĒāĻŋāĻāϰ āĻāĻžāĻāĻĒāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒā§āϰāĻĒāϏ āĻāĻŦāĻ āύāĻŋāϰā§āĻāϤ āĻāĻā§āύā§āĻ āĻĄāĻŋāĻā§āϞā§ā§āĻžāϰ āĻāϰāĻžāϰ āĻā§āώāĻŽāϤāĻž
- āĻāĻžāϞ āϰāĻžāύāĻāĻžāĻāĻŽ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāύā§āϏ (āĻā§āĻŽāĻĒā§āϞā§āĻāĻāĻŋ āĻāĻāĻ āϏā§āϝā§āĻā§ āĻāĻāĻāĻŋ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ⧠āĻāĻŽā§āĻĒāĻžāĻāϞā§āĻĄ āĻšāϝāĻŧ, āĻāĻāĻāĻŋ āĻŽāϧā§āϝāĻŦāϰā§āϤ⧠āĻĒā§āϰāĻā§āϏāĻŋ āĻāĻžāĻĄāĻŧāĻžāĻ)
- āĻāϰāĻ āĻāĻžāϞ āĻāĻāĻĄāĻŋāĻ āĻāĻžāĻāĻĒ-āĻāύāĻĢāĻžāϰā§āύā§āϏ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāύā§āϏ (āĻā§āĻĄ āĻĨā§āĻā§ āĻāĻžāĻāĻĒāĻā§āϞāĻŋ āĻŦā§āϰ āĻāϰāϤ⧠āϞā§āϝāĻžāĻā§āĻā§ā§ā§āĻ āϏāĻžāϰā§āĻāĻžāϰā§āϰ āĻāύā§āϝ āĻāĻŽ āĻāĻžāĻ)
Basic Syntax â
āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ⧠opt-in āĻāϰāϤā§, <script>
āĻŦā§āϞāĻā§ setup
āĻ
ā§āϝāĻžāĻā§āϰāĻŋāĻŦāĻŋāĻāĻ āϝā§āĻ āĻāϰā§āύ:
vue
<script setup>
console.log('hello script setup')
</script>
āĻāĻŋāϤāϰā§āϰ āĻā§āĻĄāĻāĻŋ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ setup()
āĻĢāĻžāĻāĻļāύā§āϰ āĻāύā§āĻā§āύā§āĻ āĻšāĻŋāϏā§āĻŦā§ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāϰ āĻŽāĻžāύ⧠āĻšāϞ āϝ⧠āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ <script>
āĻĨā§āĻā§ āĻāĻŋāύā§āύ, āϝā§āĻāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻŦāĻžāϰ āĻāĻā§āϏāĻŋāĻāĻŋāĻāĻ āĻšāϝāĻŧ āϝāĻāύ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻāĻŋ āĻĒā§āϰāĻĨāĻŽ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰāĻž āĻšāϝāĻŧ, <script setup>
-āĻāϰ āĻāĻŋāϤāϰā§āϰ āĻā§āĻĄāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āĻāĻāĻāĻŋ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻā§āϏāĻŋāĻāĻŋāĻāĻ āĻāϰāĻŦā§āĨ¤
Top-level bindings are exposed to template â
<script setup>
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, <script setup>
-āĻāϰ āĻāĻŋāϤāϰ⧠āĻĄāĻŋāĻā§āϞā§ā§āĻžāϰāĻĄ āϝā§āĻā§āύ⧠āĻāĻĒ-āϞā§āĻā§āϞ āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ (āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ, āĻĢāĻžāĻāĻļāύ āĻĄāĻŋāĻā§āϞā§ā§āĻžāϰ āĻāĻŦāĻ āĻāĻŽā§āĻĒā§āϰā§āĻ āϏāĻš) āϏāϰāĻžāϏāϰāĻŋ āĻā§āĻŽāĻĒā§āϞā§āĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāϝā§āĻā§āϝ:
vue
<script setup>
// variable
const msg = 'Hello!'
// functions
function log() {
console.log(msg)
}
</script>
<template>
<button @click="log">{{ msg }}</button>
</template>
āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāĻāĻ āϧāĻžāϰāĻžāϝāĻŧ āĻāύā§āĻŽā§āĻā§āϤ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāϰ āĻŽāĻžāύ⧠āĻšāϞ āĻāĻĒāύāĻŋ āĻā§āĻŽāĻĒā§āϞā§āĻ āĻāĻā§āϏāĻĒā§āϰā§āĻļāύ⧠āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰāĻž āϏāĻšāĻžāϝāĻŧāĻ āĻĢāĻžāĻāĻļāύ āϏāϰāĻžāϏāϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āĻāĻāĻŋāĻā§ methods
āĻ
āĻĒāĻļāύā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒā§āϰāĻāĻžāĻļ āύāĻž āĻāϰā§āĻ:
vue
<script setup>
import { capitalize } from './helpers'
</script>
<template>
<div>{{ capitalize('hello') }}</div>
</template>
Reactivity â
Reactivity APIs āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϰāĻŋā§ā§āĻā§āĻāĻŋāĻ āϏā§āĻā§āĻ āϏā§āĻĒāώā§āĻāĻāĻžāĻŦā§ āϤā§āϰāĻŋ āĻāϰāĻž āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤ āĻāĻāĻāĻŋ setup()
āĻĢāĻžāĻāĻļāύ āĻĨā§āĻā§ āϰāĻŋāĻāĻžāϰā§āύāĻĄ āĻā§āϝāĻžāϞā§āĻā§āϞāĻŋāϰ āĻ
āύā§āϰā§āĻĒ, āĻā§āĻŽāĻĒā§āϞā§āĻāĻā§āϞāĻŋāϤ⧠āĻāϞā§āϞā§āĻ āĻāϰāĻž āĻšāϞ⧠āϰā§āĻĢāĻā§āϞāĻŋ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ unwrapped āĻšāϝāĻŧ:
vue
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
<template>
<button @click="count++">{{ count }}</button>
</template>
Using Components â
<script setup>
āĻāϰ āϏā§āĻā§āĻĒ āĻā§āϝāĻžāϞā§āĻā§āϞāĻŋ āϏāϰāĻžāϏāϰāĻŋ āĻāĻžāϏā§āĻāĻŽ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ āĻā§āϝāĻžāĻ āύā§āĻāĻŽ āĻšāĻŋāϏāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§:
vue
<script setup>
import MyComponent from './MyComponent.vue'
</script>
<template>
<MyComponent />
</template>
āĻŽāύ⧠āĻāϰā§āύ MyComponent
āĻāĻāĻāĻŋ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ āĻšāĻŋāϏāĻžāĻŦā§ āĻāϞā§āϞā§āĻ āĻāϰāĻž āĻšāĻā§āĻā§ āĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ JSX āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĨāĻžāĻā§āύ, āϤāĻžāĻšāϞ⧠āĻŽā§āύā§āĻāĻžāϞ āĻŽāĻĄā§āϞ āĻāĻāĻžāύ⧠āĻāĻāĻ āϰāĻāĻŽāĨ¤ kebab-case āϏāĻŽāϤā§āϞā§āϝ <my-component>
āĻā§āĻŽāĻĒā§āϞā§āĻā§āĻ āĻāĻžāĻ āĻāϰ⧠- āϤāĻŦā§ PascalCase āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻā§āϝāĻžāĻāĻā§āϞāĻŋ āĻĻā§āĻĸāĻŧāĻāĻžāĻŦā§ āϏāĻžāĻŽāĻā§āĻāϏā§āϝā§āϰ āĻāύā§āϝ āϰāĻŋāĻā§āĻŽā§āύā§āĻĄ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻāĻŋ āύā§āĻāĻŋāĻ āĻāĻžāϏā§āĻāĻŽ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻĨā§āĻā§ āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻāϰāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§āĨ¤
Dynamic Components â
āϝā§āĻšā§āϤ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋ āϏā§āĻā§āϰāĻŋāĻ āĻā§āĻā§āϞāĻŋāϰ āĻ
āϧā§āύ⧠āϰā§āĻāĻŋāϏā§āĻā§āϰāĻžāĻĄ āύāĻž āĻšāϝāĻŧā§ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āĻšāĻŋāϏāĻžāĻŦā§ āĻāϞā§āϞā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§, āϤāĻžāĻ <script setup>
-āĻāϰ āĻāĻŋāϤāϰ⧠āĻĄāĻžāϝāĻŧāύāĻžāĻŽāĻŋāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻŽāĻžāĻĻā§āϰ āĻĄāĻžāĻāύāĻžāĻŽāĻŋāĻ :is
āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻāĻŋāϤ:
vue
<script setup>
import Foo from './Foo.vue'
import Bar from './Bar.vue'
</script>
<template>
<component :is="Foo" />
<component :is="someCondition ? Foo : Bar" />
</template>
āϞāĻā§āώā§āϝ āĻāϰā§āύ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋāĻā§ āĻāĻāĻāĻŋ āĻāĻžāϰāύāĻžāϰāĻŋ āĻāĻā§āϏāĻĒā§āϰā§āĻļāύ⧠āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āĻšāĻŋāϏāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
Recursive Components â
āĻāĻāĻāĻŋ āĻāϏāĻāĻĢāϏāĻŋ āϤāĻžāϰ āĻĢāĻžāĻāϞā§āϰ āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧā§ āĻ
āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤāĻāĻžāĻŦā§ āύāĻŋāĻā§āĻā§ āϰā§āĻĢāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϝā§āĻŽāύ FooBar.vue
āύāĻžāĻŽā§āϰ āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āϤāĻžāϰ āĻā§āĻŽāĻĒā§āϞā§āĻā§ āύāĻŋāĻā§āĻā§ <FooBar/>
āĻšāĻŋāϏā§āĻŦā§ āϰā§āĻĢāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤
āύā§āĻ āĻāϰā§āύ āĻāĻāĻŋ āĻāĻŽā§āĻĒā§āϰā§āĻā§āĻĄ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āϤā§āϞāύāĻžāϝāĻŧ āĻāĻŽ āĻ āĻā§āϰāĻžāϧāĻŋāĻāĻžāϰ āϰāϝāĻŧā§āĻā§āĨ¤ āĻāĻĒāύāĻžāϰ āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āύā§āĻāĻŽāĻĄ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻĨāĻžāĻā§ āϝāĻž āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻāĻŋāϰ āĻ āύā§āĻŽāĻŋāϤ āύāĻžāĻŽā§āϰ āϏāĻžāĻĨā§ āĻāύāĻĢā§āϞāĻŋāĻā§āĻ āĻāϰā§, āĻāĻĒāύāĻŋ āĻāĻŽā§āĻĒā§āϰā§āĻā§āϰ āύāĻžāĻŽ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āύ:
js
import { FooBar as FooBarChild } from './components'
Namespaced Components â
āĻāĻĒāύāĻŋ āĻ
āĻŦāĻā§āĻā§āĻā§āϰ āĻĒā§āϰā§āĻĒāĻžāϰā§āĻāĻŋāϰ āĻ
āϧā§āύ⧠āύā§āϏā§āĻ āĻāϰāĻž āĻā§āĻŽā§āĻĒā§āύā§āύā§āĻā§āĻā§āϞāĻŋāĻā§ āĻāϞā§āϞā§āĻ āĻāϰāϤ⧠<Foo.Bar>
āĻāϰ āĻŽāϤ⧠āĻĄāĻ āϏāĻš āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻā§āϝāĻžāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻĒāύāĻŋ āϝāĻāύ āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āĻĨā§āĻā§ āĻāĻāĻžāϧāĻŋāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰā§āύ āϤāĻāύ āĻāĻāĻŋ āĻĻāϰāĻāĻžāϰā§:
vue
<script setup>
import * as Form from './form-components'
</script>
<template>
<Form.Input>
<Form.Label>label</Form.Label>
</Form.Input>
</template>
Using Custom Directives â
āĻā§āϞā§āĻŦāĻžāϞāĻŋ āϰā§āĻāĻŋāϏā§āĻā§āϰāĻžāĻĄ āĻāĻžāϏā§āĻāĻŽ āĻĄāĻŋāϰā§āĻā§āĻāĻŋāĻāĻā§āϞ⧠āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§āĨ¤ āϞā§āĻāĻžāϞ āĻāĻžāϏā§āĻāĻŽ āĻā§ <script setup>
-āĻāϰ āϏāĻžāĻĨā§ āϏā§āĻĒāώā§āĻāĻāĻžāĻŦā§ āϰā§āĻāĻŋāϏā§āĻā§āϰāĻžāĻĄ āĻšāĻāϝāĻŧāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āύā§āĻ, āϤāĻŦā§ āϤāĻžāĻĻā§āϰ āĻ
āĻŦāĻļā§āϝāĻ āύā§āĻāĻŽāĻŋāĻ āϏā§āĻāĻŋāĻŽ vNameOfDirective
āĻ
āύā§āϏāϰāĻŖ āĻāϰāϤ⧠āĻšāĻŦā§:
vue
<script setup>
const vMyDirective = {
beforeMount: (el) => {
// do something with the element
}
}
</script>
<template>
<h1 v-my-directive>This is a Heading</h1>
</template>
āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻ āύā§āϝ āĻā§āĻĨāĻžāĻ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻĄāĻŋāϰā§āĻā§āĻāĻŋāĻ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰ⧠āĻĨāĻžāĻā§āύ, āϤāĻžāĻšāϞ⧠āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āύā§āĻāĻŽāĻŋāĻ āϏā§āĻāĻŋāĻŽā§āϰ āϏāĻžāĻĨā§ āĻŽāĻžāύāĻžāύāϏāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻŋāϰ āύāĻžāĻŽ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§:
vue
<script setup>
import { myDirective as vMyDirective } from './MyDirective.js'
</script>
defineProps() & defineEmits() â
āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻĒā§āϰāĻāĻžāϰā§āϰ āĻ
āύā§āĻŽāĻžāύ āϏāĻŽāϰā§āĻĨāύ āϏāĻš props
āĻāĻŦāĻ emits
āĻāϰ āĻŽāϤ⧠āĻ
āĻĒāĻļāύ āĻĄāĻŋāĻā§āϞā§ā§āĻžāϰ āĻāϰāϤā§, āĻāĻŽāϰāĻž defineProps
āĻāĻŦāĻ defineEmits
āĻāĻĒāĻŋāĻāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ, āϝāĻž <script setup>
-āĻāϰ āĻŽāϧā§āϝ⧠āĻ
āĻā§āĻŽā§āĻāĻŋāĻā§āϞāĻŋ āĻ
ā§āϝāĻžāĻāĻžāĻāϞāĻāĻŦāϞ āĻšāĻŦā§:
vue
<script setup>
const props = defineProps({
foo: String
})
const emit = defineEmits(['change', 'delete'])
// setup code
</script>
defineProps
āĻāĻŦāĻdefineEmits
āĻšāϞ āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻŽā§āϝāĻžāĻā§āϰ⧠āĻļā§āϧā§āĻŽāĻžāϤā§āϰ<script setup>
-āĻāϰ āĻŽāϧā§āϝ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāϝā§āĻā§āϝāĨ¤ āϏā§āĻā§āϞāĻŋ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āύā§āĻ āĻāĻŦāĻ<script setup>
āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰāĻž āĻšāϞ⧠āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻž āĻšāϝāĻŧāĨ¤defineProps
props
āĻ āĻĒāĻļāύā§āϰ āĻŽāϤ⧠āĻāĻāĻ āĻā§āϝāĻžāϞ⧠āĻā§āϰāĻšāĻŖ āĻāϰā§, āϝāĻāύdefineEmits
emits
āĻ āĻĒāĻļāύā§āϰ āĻŽāϤ⧠āĻāĻāĻ āĻā§āϝāĻžāϞ⧠āĻā§āϰāĻšāĻŖ āĻāϰā§āĨ¤defineProps
āĻāĻŦāĻdefineEmits
āĻĒāĻžāϏ āĻāϰāĻž āĻ āĻĒāĻļāύāĻā§āϞāĻŋāϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āϏāĻ āĻŋāĻ āĻāĻžāĻāĻĒā§āϰ āĻāύāĻĢāĻžāϰā§āύā§āϏ āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§āĨ¤defineProps
āĻāĻŦāĻdefineEmits
-āĻ āĻĒāĻžāϏ āĻāϰāĻž āĻ āĻĒāĻļāύāĻā§āϞāĻŋ āϏā§āĻāĻāĻĒā§āϰ āĻŦāĻžāĻāϰ⧠āĻŽāĻĄāĻŋāĻāϞ āϏā§āĻā§āĻĒā§ āĻšā§āĻāϏā§āĻā§āĻĄ āĻāϰāĻž āĻšāĻŦā§āĨ¤ āĻ āϤāĻāĻŦ, āĻ āĻĒāĻļāύāĻā§āϞāĻŋ āϏā§āĻāĻāĻĒ āϏā§āϝā§āĻā§ āĻĄāĻŋāĻā§āϞā§ā§āĻžāĻĄ āϞā§āĻāĻžāϞ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞā§āϰ āĻāϞā§āϞā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āύāĻžāĨ¤ āĻāĻāĻŋ āĻāϰāĻžāϰ āĻĢāϞ⧠āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāϰ āĻšāĻŦā§āĨ¤ āϝāĻžāĻāĻšā§āĻ, it can reference āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰāĻž āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ āϝā§āĻšā§āϤ⧠āϤāĻžāϰāĻž āĻŽāĻĄāĻŋāĻāϞ āϏā§āĻā§āĻĒ āϰāϝāĻŧā§āĻā§āĨ¤
Type-only props/emit declarations â
'defineProps' āĻŦāĻž 'defineEmits'-āĻ āĻāĻāĻāĻŋ āĻāĻā§āώāϰāĻŋāĻ āĻāĻžāĻāĻĒ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻĒāĻžāϏ āĻāϰ⧠āĻĒāĻŋāĻāϰ-āĻāĻžāĻāĻĒ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒā§āϰāĻĒāϏ āĻāĻŦāĻ āĻāĻŽāĻŋāĻ āĻĄāĻŋāĻā§āϞā§ā§āĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§:
ts
const props = defineProps<{
foo: string
bar?: number
}>()
const emit = defineEmits<{
(e: 'change', id: number): void
(e: 'update', value: string): void
}>()
// 3.3+: alternative, more succinct syntax
const emit = defineEmits<{
change: [id: number] // named tuple syntax
update: [value: string]
}>()
defineProps
āĻŦāĻždefineEmits
āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϰāĻžāύāĻāĻžāĻāĻŽ āĻĄāĻŋāĻā§āϞā§ā§āĻžāϰ āĻŦāĻž āĻāĻžāĻāĻĒ āĻĄāĻŋāĻā§āϞā§ā§āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻāĻ āϏāĻŽāϝāĻŧā§ āĻāĻāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻĢāϞ⧠āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāϰ āĻšāĻŦā§āĨ¤āĻāĻžāĻāĻĒ āĻĄāĻŋāĻā§āϞā§āϝāĻŧāĻžāϰā§āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻĄāĻŦāϞ āĻĄāĻŋāĻā§āϞā§āϝāĻŧāĻžāϰā§āĻļāύā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧāϤāĻž āĻĻā§āϰ āĻāϰāϤ⧠āĻāĻŦāĻ āϏāĻ āĻŋāĻ āϰāĻžāύāĻāĻžāĻāĻŽ āĻŦā§āĻšā§āϝāĻŋāĻāĻŋā§āĻžāϰ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āϏā§āĻā§āϝāĻžāĻāĻŋāĻ āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻĨā§āĻā§ āϏāĻŽāϤā§āϞā§āϝ āϰāĻžāύāĻāĻžāĻāĻŽ āĻā§āώāĻŖāĻž āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āϤā§āϰāĻŋ āĻšāϝāĻŧāĨ¤
āĻĄā§āĻ āĻŽā§āĻĄā§, āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻāĻžāĻāĻĒāĻā§āϞāĻŋ āĻĨā§āĻā§ āϏāĻāĻļā§āϞāĻŋāώā§āĻ āϰāĻžāύāĻāĻžāĻāĻŽ āĻā§āϝāĻžāϞāĻŋāĻĄā§āĻļāύ āĻāύāĻĢāĻžāϰ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻŦā§āĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ āĻāĻāĻžāύā§
foo: String
āĻāύāĻĢāĻžāϰāĻĄ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§foo: string
āĻĒā§āϰāĻāĻžāϰ āĻĨā§āĻā§āĨ¤ āϝāĻĻāĻŋ āĻāĻžāĻāĻĒāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰāĻž āĻāĻžāĻāĻĒā§āϰ āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧠āĻāύāĻĢāĻžāϰāĻĄ āĻāϰāĻž āĻĢāϞāĻžāĻĢāϞ āĻšāĻŦā§foo: null
(any
āĻāĻžāĻāĻĒā§āϰ āϏāĻŽāĻžāύ) āϝā§āĻšā§āϤ⧠āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰā§āϰ āĻāĻžāĻā§ āĻāĻā§āϏāĻāĻžāϰāύāĻžāϞ āĻĢāĻžāĻāϞā§āϰ āϤāĻĨā§āϝ āύā§āĻāĨ¤āĻĒā§āϰā§āĻĄ āĻŽā§āĻĄā§, āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻŦāĻžāύā§āĻĄā§āϞā§āϰ āϏāĻžāĻāĻ āĻāĻŽāĻžāϤ⧠āĻ ā§āϝāĻžāϰ⧠āĻĢāϰāĻŽā§āϝāĻžāĻ āĻĄāĻŋāĻā§āϞāĻžāϰā§āĻāĻļāύ āϤā§āϰāĻŋ āĻāϰāĻŦā§ (āĻāĻāĻžāύ⧠āĻĒā§āϰāĻĒāĻā§āϞāĻŋ
['foo', 'āĻŦāĻžāϰ']
āĻ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻž āĻšāĻŦā§)
āϏāĻāϏā§āĻāϰāĻŖ 3.2 āĻāĻŦāĻ āύā§āĻā§,
defineProps()
-āĻāϰ āĻāύā§āϝ āĻā§āύā§āϰāĻŋāĻ āĻāĻžāĻāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻāĻāĻāĻŋ āϞāĻŋāĻāĻžāϰāĻžāϞ āĻāĻžāĻāĻĒ āĻŦāĻž āϞā§āĻāĻžāϞ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻāĻāĻāĻŋ āϰā§āĻĢāĻžāϰā§āύā§āϏā§āϰ āĻŽāϧā§āϝ⧠āϏā§āĻŽāĻžāĻŦāĻĻā§āϧ āĻāĻŋāϞāĨ¤āĻāĻ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž 3.3 āĻ āϏāĻŽāĻžāϧāĻžāύ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤ Vue-āĻāϰ āϏāϰā§āĻŦāĻļā§āώ āϏāĻāϏā§āĻāϰāĻŖāĻāĻŋ āĻāĻžāĻāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻĒāĻāĻŋāĻļāύ⧠āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰāĻž āϰā§āĻĢāĻžāϰā§āύā§āϏāĻŋāĻ āĻāĻŦāĻ āĻāĻāĻŋāϞ āĻāĻžāĻāĻĒā§āϰ āĻāĻāĻāĻŋ āϏā§āĻŽāĻŋāϤ āϏā§āĻ āϏāĻŽāϰā§āĻĨāύ āĻāϰā§āĨ¤ āϝāĻžāĻāĻšā§āĻ, āϝā§āĻšā§āϤ⧠āϰāĻžāύāĻāĻžāĻāĻŽ āĻāύāĻāĻžāϰāĻļā§āύ āϧāϰāύāĻāĻŋ āĻāĻāύāĻ AST-āĻāĻŋāϤā§āϤāĻŋāĻ, āĻāĻŋāĻā§ āĻāĻŽāĻĒā§āϞā§āĻā§āϏ āĻāĻžāĻāĻĒā§āϰ āĻĒā§āϰāĻā§āϤ āĻāĻžāĻāĻĒ āĻ ā§āϝāĻžāύāĻžāϞāĻžāĻāϏāĻŋāϏ āĻĒā§āϰāϝāĻŧā§āĻāύ, āϝā§āĻŽāύ āĻāύā§āĻĄāĻŋāĻļāύāĻžāϞ āĻāĻžāĻāĻĒ, āϏāĻŽāϰā§āĻĨāĻŋāϤ āύāϝāĻŧāĨ¤ āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āϏāĻŋāĻā§āĻā§āϞ āĻĒā§āϰāĻĒā§āϰ āϧāϰāĻŖā§āϰ āĻāύā§āϝ āĻļāϰā§āϤāϏāĻžāĻĒā§āĻā§āώ āĻāĻžāĻāĻĒāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āϤāĻŦā§ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻĒā§āϰāĻĒāϏ āĻ āĻŦāĻā§āĻā§āĻ āύāϝāĻŧāĨ¤
Reactive Props Destructure â
In Vue 3.5 and above, variables destructured from the return value of defineProps
are reactive. Vue's compiler automatically prepends props.
when code in the same <script setup>
block accesses variables destructured from defineProps
:
ts
const { foo } = defineProps(['foo'])
watchEffect(() => {
// runs only once before 3.5
// re-runs when the "foo" prop changes in 3.5+
console.log(foo)
})
The above is compiled to the following equivalent:
js
const props = defineProps(['foo'])
watchEffect(() => {
// `foo` transformed to `props.foo` by the compiler
console.log(props.foo)
})
In addition, you can use JavaScript's native default value syntax to declare default values for the props. This is particularly useful when using the type-based props declaration:
ts
interface Props {
msg?: string
labels?: string[]
}
const { msg = 'hello', labels = ['one', 'two'] } = defineProps<Props>()
Default props values when using type declaration â
In 3.5 and above, default values can be naturally declared when using Reactive Props Destructure. But in 3.4 and below, Reactive Props Destructure is not enabled by default. In order to declare props default values with type-based declaration, the withDefaults
compiler macro is needed:
ts
interface Props {
msg?: string
labels?: string[]
}
const props = withDefaults(defineProps<Props>(), {
msg: 'hello',
labels: () => ['one', 'two']
})
āĻāĻāĻŋ āϏāĻŽāϤā§āϞā§āϝ āϰāĻžāύāĻāĻžāĻāĻŽ āĻĒā§āϰāĻĒāϏ default
āĻ
āĻĒāĻļāύā§āϰ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻž āĻšāĻŦā§āĨ¤ āĻāĻĒāϰāύā§āϤā§, withDefaults
āĻšā§āϞā§āĻĒāĻžāϰ āĻĄāĻŋāĻĢāϞā§āĻ āĻā§āϝāĻžāϞā§āĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāĻžāĻāĻĒ āĻā§āĻ āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠āĻāĻŦāĻ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰ⧠āϝ⧠āĻĒā§āϰāϤā§āϝāĻžāĻŦāϰā§āϤāĻŋāϤ props
āĻāĻžāĻāĻĒāĻāĻŋāϤ⧠āĻĄāĻŋāĻĢāϞā§āĻ āĻā§āϝāĻžāϞ⧠āĻĄāĻŋāĻā§āϞāĻžāϰāĻĄ āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻ
āĻĒāĻļāύāĻžāϞ āĻĢā§āϞā§āϝāĻžāĻāĻā§āϞāĻŋ āϰāĻŋāĻŽā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤
INFO
Note that default values for mutable reference types (like arrays or objects) should be wrapped in functions when using withDefaults
to avoid accidental modification and external side effects. This ensures each component instance gets its own copy of the default value. This is not necessary when using default values with destructure.
defineModel() â
- Only available in 3.4+
āĻāĻ āĻŽā§āϝāĻžāĻā§āϰā§āĻāĻŋ āĻāĻāĻāĻŋ āĻĻā§āĻŦāĻŋ-āĻŽā§āĻā§ āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ āĻĒā§āϰāĻĒ āĻā§āώāĻŖāĻž āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠āϝāĻž āĻŽā§āϞ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻĨā§āĻā§ v-model
āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ v-model
āĻāĻžāĻāĻĄā§āĻ āĻāϞā§āĻāύāĻž āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤
āĻšā§āĻĄā§āϰ āύāĻŋāĻā§, āĻāĻ āĻŽā§āϝāĻžāĻā§āϰ⧠āĻāĻāĻāĻŋ āĻŽāĻĄā§āϞ āĻĒā§āϰāĻĒ āĻāĻŦāĻ āĻāĻāĻāĻŋ āϏāĻāĻļā§āϞāĻŋāώā§āĻ āĻŽāĻžāύ āĻāĻĒāĻĄā§āĻ āĻāĻā§āύā§āĻ āĻā§āώāĻŖāĻž āĻāϰā§āĨ¤ āϝāĻĻāĻŋ āĻĒā§āϰāĻĨāĻŽ āĻāϰā§āĻā§āĻŽā§āύā§āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻā§āώāϰāĻŋāĻ āϏā§āĻā§āϰāĻŋāĻ āĻšāϝāĻŧ āϤāĻŦā§ āĻāĻāĻŋ āĻĒā§āϰāĻĒ āύāĻžāĻŽ āĻšāĻŋāϏāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāĻŦā§; āĻ
āύā§āϝāĻĨāĻžāϝāĻŧ āĻĒā§āϰāĻĒ āύāĻžāĻŽāĻāĻŋ āĻĄāĻŋāĻĢāϞā§āĻ āĻšāĻŦā§ "modelValue"
āĨ¤ āĻāĻāϝāĻŧ āĻā§āώā§āϤā§āϰā§āĻ, āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻ
āϤāĻŋāϰāĻŋāĻā§āϤ āĻ
āĻŦāĻā§āĻā§āĻāĻ āĻĒāĻžāϏ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āϝāĻž āĻĒā§āϰāĻĒā§āϰ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋ āĻāĻŦāĻ āĻŽāĻĄā§āϞ āϰā§āĻĢā§āϰ āĻŽāĻžāύ āϰā§āĻĒāĻžāύā§āϤāϰ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋ āĻ
āύā§āϤāϰā§āĻā§āĻā§āϤ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤
js
// declares "modelValue" prop, consumed by parent via v-model
const model = defineModel()
// OR: declares "modelValue" prop with options
const model = defineModel({ type: String })
// emits "update:modelValue" when mutated
model.value = 'hello'
// declares "count" prop, consumed by parent via v-model:count
const count = defineModel('count')
// OR: declares "count" prop with options
const count = defineModel('count', { type: Number, default: 0 })
function inc() {
// emits "update:count" when mutated
count.value++
}
WARNING
āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻžāĻā§ defineModel
āĻĒā§āϰāĻĒā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ default
āĻŽāĻžāύ āĻĨāĻžāĻā§ āĻāĻŦāĻ āĻāĻĒāύāĻŋ āĻāĻ āĻĒā§āϰāĻĒā§āϰ āĻāύā§āϝ āĻ
āĻāĻŋāĻāĻžāĻŦāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻĨā§āĻā§ āĻā§āύ⧠āĻŽāĻžāύ āĻĒā§āϰāĻĻāĻžāύ āύāĻž āĻāϰā§āύ, āϤāĻžāĻšāϞ⧠āĻāĻāĻŋ āĻĒāĻŋāϤāĻžāĻŽāĻžāϤāĻž āĻāĻŦāĻ āĻļāĻŋāĻļā§ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋāϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋ āĻĄāĻŋ-āϏāĻŋāĻā§āĻā§āϰā§āύāĻžāĻāĻā§āĻļāύ āϏā§āώā§āĻāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āύā§āĻā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§, āĻĒāĻŋāϤāĻžāĻŽāĻžāϤāĻžāϰ myRef
āĻ
āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ, āĻāĻŋāύā§āϤ⧠āϏāύā§āϤāĻžāύā§āϰ model
āĻšāϞ 1:
vue
<script setup>
const model = defineModel({ default: 1 })
</script>
vue
<script setup>
const myRef = ref()
</script>
<template>
<Child v-model="myRef"></Child>
</template>
Modifiers and Transformers â
v-model
āύāĻŋāϰā§āĻĻā§āĻļā§āϰ āϏāĻžāĻĨā§ āĻŦā§āϝāĻŦāĻšā§āϤ āĻŽāĻĄāĻŋāĻĢāĻžāϝāĻŧāĻžāϰ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤā§, āĻāĻŽāϰāĻž defineModel()
āĻāϰ āϰāĻŋāĻāĻžāϰā§āύ āĻŽāĻžāύāĻā§ āĻāĻāĻžāĻŦā§ āϧā§āĻŦāĻāϏ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ:
js
const [modelValue, modelModifiers] = defineModel()
// corresponds to v-model.trim
if (modelModifiers.trim) {
// ...
}
āϝāĻāύ āĻāĻāĻāĻŋ āϏāĻāĻļā§āϧāĻ āĻāĻĒāϏā§āĻĨāĻŋāϤ āĻĨāĻžāĻā§, āϤāĻāύ āĻāĻŽāĻžāĻĻā§āϰ āϏāĻŽā§āĻāĻŦāϤ āĻŽāĻžāύāĻāĻŋ āĻĒā§āϝāĻžāϰā§āύā§āĻā§āϰ āϏāĻžāĻĨā§ āĻĒāĻĄāĻŧāĻžāϰ āĻŦāĻž āϏāĻŋāĻā§āĻ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āϰā§āĻĒāĻžāύā§āϤāϰ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āĻāĻŽāϰāĻž get
āĻāĻŦāĻ set
āĻā§āϰāĻžāύā§āϏāĻĢāϰāĻŽāĻžāϰ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻŋ āĻ
āϰā§āĻāύ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ:
js
const [modelValue, modelModifiers] = defineModel({
// get() omitted as it is not needed here
set(value) {
// if the .trim modifier is used, return trimmed value
if (modelModifiers.trim) {
return value.trim()
}
// otherwise, return the value as-is
return value
}
})
Usage with TypeScript â
defineProps
āĻāĻŦāĻ defineEmits
āĻāϰ āĻŽāϤā§, defineModel
āĻŽāĻĄā§āϞā§āϰ āĻŽāĻžāύ āĻāĻŦāĻ āĻŽāĻĄāĻŋāĻĢāĻžāϝāĻŧāĻžāϰā§āϰ āϧāϰāύ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰāϤ⧠āĻāĻžāĻāĻĒ āĻāϰā§āĻā§āĻŽā§āύā§āĻāĻ āĻĒā§āϤ⧠āĻĒāĻžāϰā§:
ts
const modelValue = defineModel<string>()
// ^? Ref<string | undefined>
// default model with options, required removes possible undefined values
const modelValue = defineModel<string>({ required: true })
// ^? Ref<string>
const [modelValue, modifiers] = defineModel<string, 'trim' | 'uppercase'>()
// ^? Record<'trim' | 'uppercase', true | undefined>
defineExpose() â
<script setup>
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋ āĻĄāĻŋāĻĢāϞā§āĻāϰā§āĻĒā§ āĻŦāύā§āϧ āĻĨāĻžāĻā§ - āϝā§āĻŽāύ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āϏāϰā§āĻŦāĻāύā§āύ āĻāĻĻāĻžāĻšāϰāĻŖ, āϝāĻž āĻā§āĻŽāĻĒā§āϞā§āĻ āϰā§āĻĢ āĻŦāĻž $parent
āĻā§āĻāύā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧ, āĻĄāĻŋāĻā§āϞāĻžāϰāĻĄ āĻā§āύ⧠āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ āĻā§ āĻĒā§āϰāĻāĻžāĻļ āĻāϰāĻŦā§ āύāĻž <script setup>
āĻāϰ āĻāĻŋāϤāϰā§āĨ¤
āĻāĻāĻāĻŋ <script setup>
āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ āĻĒā§āϰā§āĻĒāĻžāϰā§āĻāĻŋāĻā§āϞāĻŋ āϏā§āĻĒāώā§āĻāĻāĻžāĻŦā§ āĻĒā§āϰāĻāĻžāĻļ āĻāϰāϤā§, defineExpose
āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻŽā§āϝāĻžāĻā§āϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ:
vue
<script setup>
import { ref } from 'vue'
const a = 1
const b = ref(2)
defineExpose({
a,
b
})
</script>
āϝāĻāύ āĻāĻāĻāĻŋ āĻĒā§āϝāĻžāϰā§āύā§āĻ āĻā§āĻŽāĻĒā§āϞā§āĻ āϰā§āĻĢā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻāĻŋāϰ āĻāĻāĻāĻŋ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āĻĒāĻžāύ, āϤāĻāύ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰāĻā§āϤ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ { a: number, b: number }
āĻāĻāĻžāϰā§āϰ āĻšāĻŦā§ (āϰā§āĻĢāĻā§āϞāĻŋ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻāĻĻāĻžāĻšāϰāĻŖā§āϰ āĻŽāϤā§āĻ unwrapped āĻšāϝāĻŧ)āĨ¤
defineOptions() â
- āĻļā§āϧā§āĻŽāĻžāϤā§āϰ ā§Š.ā§Š+ āĻ āϏāĻŽāϰā§āĻĨāĻŋāϤ
āĻāĻ āĻŽā§āϝāĻžāĻā§āϰā§āĻāĻŋ āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ <script>
āĻŦā§āϞāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻāϰ⧠āϏāϰāĻžāϏāϰāĻŋ <script setup>
āĻāϰ āĻāĻŋāϤāϰ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻ
āĻĒāĻļāύ āĻĄāĻŋāĻā§āϞā§ā§āĻžāϰ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§:
vue
<script setup>
defineOptions({
inheritAttrs: false,
customOptions: {
/* ... */
}
})
</script>
- This is a macro. The options will be hoisted to module scope and cannot access local variables in
<script setup>
that are not literal constants.
defineSlots() â
- āĻļā§āϧā§āĻŽāĻžāϤā§āϰ ā§Š.ā§Š+ āĻ āϏāĻŽāϰā§āĻĨāĻŋāϤ
This macro can be used to provide type hints to IDEs for slot name and props type checking.
defineSlots()
āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻŋ āĻāĻžāĻāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āϰāĻŋāϏāĻŋāĻ āĻāϰ⧠āĻāĻŦāĻ āĻā§āύ⧠āϰāĻžāύāĻāĻžāĻāĻŽ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āύā§āĻāĨ¤ āĻāĻžāĻāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻāĻāĻāĻŋ āĻāĻžāĻāĻĒ āϞāĻŋāĻāĻžāϰāĻžāϞ āĻšāĻāϝāĻŧāĻž āĻāĻāĻŋāϤ āϝā§āĻāĻžāύ⧠āĻĒā§āϰā§āĻĒāĻžāϰā§āĻāĻŋ āĻā§-āĻāĻŋ āϏā§āϞāĻā§āϰ āύāĻžāĻŽ āĻāĻŦāĻ āĻā§āϝāĻžāϞā§āϰ āĻāĻžāĻāĻĒāĻāĻŋ āϏā§āϞāĻ āĻĢāĻžāĻāĻļāύāĨ¤ āĻĢāĻžāĻāĻļāύā§āϰ āĻĒā§āϰāĻĨāĻŽ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻšāϞ āĻĒā§āϰāĻĒāϏ āϝāĻž āϏā§āϞāĻ āĻĒāĻžāĻāϝāĻŧāĻžāϰ āĻāĻļāĻž āĻāϰ⧠āĻāĻŦāĻ āĻāϰ āĻāĻžāĻāĻĒāĻāĻŋ āĻā§āĻŽāĻĒā§āϞā§āĻā§āϰ āϏā§āϞāĻ āĻĒā§āϰāĻĒāϏā§āϰ āĻāύā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāĻŦā§āĨ¤ āϰāĻŋāĻāĻžāϰā§āύā§āϰ āĻāĻžāĻāĻĒāĻāĻŋ āĻŦāϰā§āϤāĻŽāĻžāύ⧠āĻāĻĒā§āĻā§āώāĻž āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āĻāĻŦāĻ āĻāĻāĻŋ any
āĻšāϤ⧠āĻĒāĻžāϰā§, āϤāĻŦā§ āĻāĻŽāϰāĻž āĻāĻŦāĻŋāώā§āϝāϤ⧠āϏā§āϞāĻ āϏāĻžāĻŽāĻā§āϰ⧠āĻā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻŋāϰ āϏā§āĻŦāĻŋāϧāĻž āύāĻŋāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
āĻāĻāĻŋ slots
āĻ
āĻŦāĻā§āĻā§āĻāĻ āϰāĻŋāĻāĻžāϰā§āύ āĻĻā§āϝāĻŧ, āϝāĻž āϏā§āĻāĻāĻĒ āĻĒā§āϰāϏāĻā§āĻā§ āĻĒā§āϰāĻāĻžāĻļāĻŋāϤ slots
āĻ
āĻŦāĻā§āĻā§āĻā§āϰ āϏāĻŽāϤā§āϞā§āϝ āĻ
āĻĨāĻŦāĻž useSlots()
āĻĻā§āĻŦāĻžāϰāĻž āϰāĻŋāĻāĻžāϰā§āύāĻĄ āĻšāϝāĻŧāĨ¤
vue
<script setup lang="ts">
const slots = defineSlots<{
default(props: { msg: string }): any
}>()
</script>
useSlots()
& useAttrs()
â
<script setup>
-āĻāϰ āĻāĻŋāϤāϰ⧠slots
āĻāĻŦāĻ attrs
-āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āϤā§āϞāύāĻžāĻŽā§āϞāĻāĻāĻžāĻŦā§ āĻŦāĻŋāϰāϞ āĻšāĻāϝāĻŧāĻž āĻāĻāĻŋāϤ, āĻāĻžāϰāĻŖ āĻāĻĒāύāĻŋ āĻā§āĻŽāĻĒā§āϞā§āĻā§ $slots
āĻāĻŦāĻ $attrs
āĻšāĻŋāϏā§āĻŦā§ āϏāϰāĻžāϏāϰāĻŋ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤ āĻŦāĻŋāϰāϞ āĻā§āώā§āϤā§āϰ⧠āϝā§āĻāĻžāύ⧠āĻāĻĒāύāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϝāĻŧ, āϝāĻĨāĻžāĻā§āϰāĻŽā§ useSlots
āĻāĻŦāĻ useAttrs
āĻšā§āϞā§āĻĒāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ:
vue
<script setup>
import { useSlots, useAttrs } from 'vue'
const slots = useSlots()
const attrs = useAttrs()
</script>
useSlots
āĻāĻŦāĻ useAttrs
āĻšāϞ āĻĒā§āϰāĻā§āϤ āϰāĻžāύāĻāĻžāĻāĻŽ āĻĢāĻžāĻāĻļāύ āϝāĻž setupContext.slots
āĻāĻŦāĻ setupContext.attrs
āĻāϰ āϏāĻŽāϤā§āϞā§āϝ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰā§āĨ¤ āĻāĻā§āϞāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻāĻŽā§āĻĒā§āĻāĻŋāĻļāύ API āĻĢāĻžāĻāĻļāύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
Usage alongside normal <script>
â
<script setup>
āϏāĻžāϧāĻžāϰāĻŖ <script>
āĻāϰ āϏāĻžāĻĨā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻāĻāĻŋ āύāϰāĻŽāĻžāϞ <script>
āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϤ⧠āĻĒāĻžāϰ⧠āϝā§āĻ āĻā§āώā§āϤā§āϰ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ:
- āϝ⧠āĻ
āĻĒāĻļāύāĻā§āϞāĻŋ
<script setup>
-āĻ āĻĒā§āϰāĻāĻžāĻļ āĻāϰāĻž āϝāĻžāϝāĻŧ āύāĻž āϏā§āĻā§āϞāĻŋ āĻĄāĻŋāĻā§āϞā§ā§āĻžāϰ āĻāϰā§āύ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒinheritAttrs
āĻŦāĻž āĻĒā§āϞāĻžāĻāĻāύāĻā§āϞāĻŋāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāύāĻžāĻŦāϞ āĻāϰāĻž āĻāĻžāϏā§āĻāĻŽ āĻ āĻĒāĻļāύāĻā§āϞāĻŋ (3.3-āĻ [defineOptions
](/api/sfc-script-setup#defineoptions āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāĻŋāϤ āĻšāϤ⧠āĻĒāĻžāϰā§) +)āĨ¤ - āύā§āĻāĻŽāĻĄ āĻāĻā§āϏāĻĒā§āϰā§āĻ āĻĄāĻŋāĻā§āϞā§ā§āĻžāϰ āĻāϰāĻžāĨ¤
- āϏāĻžāĻāĻĄ āĻāĻĢā§āĻā§āĻ āĻāĻžāϞāĻžāύ āĻŦāĻž āĻāĻŽāύ āĻ āĻŦāĻā§āĻā§āĻ āϤā§āϰāĻŋ āĻāϰā§āύ āϝāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻŦāĻžāϰ āĻāĻā§āϏāĻŋāĻāĻŋāĻāĻ āĻāϰāĻž āĻāĻāĻŋāϤāĨ¤
vue
<script>
// normal <script>, executed in module scope (only once)
runSideEffectOnce()
// declare additional options
export default {
inheritAttrs: false,
customOptions: {}
}
</script>
<script setup>
// executed in setup() scope (for each instance)
</script>
āĻāĻāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ <script setup>
āĻāĻŦāĻ <script>
āĻāĻāϤā§āϰāĻŋāϤ āĻāϰāĻžāϰ āĻāύā§āϝ āϏāĻžāĻĒā§āϰā§āĻā§āĻĄ, āĻāĻĒāϰ⧠āĻŦāϰā§āĻŖāĻŋāϤ āĻĒāϰāĻŋāϏā§āĻĨāĻŋāϤāĻŋāϤ⧠āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāĨ¤ āĻŦāĻŋāĻļā§āώāĻāĻžāĻŦā§:
- NOT āĻ
āĻĒāĻļāύāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ
<script>
āϏā§āĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ āύāĻž āϝāĻž<script setup>
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻĄāĻŋāĻĢāĻžāĻāύāĻĄ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§, āϝā§āĻŽāύprops
āĻāĻŦāĻemits
āĨ¤ <script setup>
-āĻāϰ āĻŽāϧā§āϝ⧠āϤā§āϰāĻŋ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞāĻā§āϞāĻŋāĻā§ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ⧠āĻĒā§āϰāĻĒāĻžāϰā§āĻāĻŋ āĻšāĻŋāϏā§āĻŦā§ āϝā§āĻ āĻāϰāĻž āĻšāϝāĻŧ āύāĻž, āϝāĻž āĻ āĻĒāĻļāύ āĻāĻĒāĻŋāĻāĻ āĻĨā§āĻā§ āĻ ā§āϝāĻžāĻā§āϏā§āϏāϝā§āĻā§āϝ āĻāϰ⧠āϤā§āϞā§āĨ¤ āĻāĻāĻāĻžāĻŦā§ Mixing API āĻā§āϞāĻŋāĻā§ āĻĻā§āĻĸāĻŧāĻāĻžāĻŦā§ āύāĻŋāϰā§ā§āϏāĻžāĻšāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧ⧎
āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āϏāĻžāĻĒā§āϰā§āĻā§āĻĄ āύāϝāĻŧ āĻāĻŽāύ āĻĒāϰāĻŋāϏā§āĻĨāĻŋāϤāĻŋāϤ⧠āύāĻŋāĻā§āĻā§ āĻā§āĻāĻā§ āĻĒāĻžāύ āϤāĻžāĻšāϞ⧠<script setup>
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āĻāĻĒāύāĻžāϰ āĻāĻāĻāĻŋ āϏā§āĻĒāώā§āĻ setup()
āĻĢāĻžāĻāĻļāύ⧠āϏā§āϝā§āĻāĻ āĻāϰāĻžāϰ āĻāĻĨāĻž āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰāĻž āĻāĻāĻŋāϤāĨ¤
Top-level await
â
āĻāĻĒ-āϞā§āĻā§āϞ await
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠<script setup>
āĻāϰ āĻŽāϧā§āϝā§āĨ¤ āĻĢāϞāϏā§āĻŦāϰā§āĻĒ āĻā§āĻĄāĻāĻŋ async setup()
āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻž āĻšāĻŦā§:
vue
<script setup>
const post = await fetch(`/api/post/1`).then((r) => r.json())
</script>
āĻāĻĒāϰāύā§āϤā§, āĻĒā§āϰāϤā§āĻā§āώāĻŋāϤ āĻāĻā§āϏāĻĒā§āϰā§āĻļāύāĻāĻŋ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻĢāϰāĻŽā§āϝāĻžāĻā§ āϏāĻāĻāϞāĻŋāϤ āĻšāĻŦā§ āϝāĻž await
āĻāϰ āĻĒāϰ⧠āĻāĻžāϰā§āύā§āĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻāĻĻāĻžāĻšāϰāĻŖā§āϰ āĻāύāĻā§āĻā§āϏ āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§āĨ¤
āύā§āĻ
async setup()
āĻāϰ āϏāĻžāĻĨā§ Suspense
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāĻŦā§, āϝāĻž āĻāĻāύāĻ āĻĒāϰā§āĻā§āώāĻžāĻŽā§āϞāĻ āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĨ¤ āĻāĻŽāϰāĻž āĻĒāϰāĻŦāϰā§āϤ⧠āϰāĻŋāϞāĻŋāĻā§ āĻāĻāĻŋ āĻā§āĻĄāĻŧāĻžāύā§āϤ āĻāϰāĻžāϰ āĻāĻŦāĻ āĻĄāĻā§āĻŽā§āύā§āĻ āĻāϰāĻžāϰ āĻĒāϰāĻŋāĻāϞā§āĻĒāύāĻž āĻāϰāĻāĻŋāĨ¤ āϤāĻŦā§, āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻāύāĻ āĻāĻžāύāϤ⧠āĻāĻā§āϰāĻšā§ āĻšāύ, āϤāĻžāĻšāϞ⧠āĻāĻĒāύāĻŋ āĻāϰ āĻĒāϰā§āĻā§āώāĻž āĻĻā§āĻāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
Import Statements â
āĻāĻŋāĻāϤ⧠āĻŦāĻŋāĻŦā§āϤāĻŋ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰā§āύ ECMAScript āĻŽāĻĄāĻŋāĻāϞ āϏā§āĻĒā§āϏāĻŋāĻĢāĻŋāĻā§āĻļāύāĨ¤ āĻāĻĒāϰāύā§āϤā§, āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āĻŦāĻŋāϞā§āĻĄ āĻā§āϞ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ⧠āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāĻĒāύāĻžāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
vue
<script setup>
import { ref } from 'vue'
import { componentA } from './Components'
import { componentB } from '@/Components'
import { componentC } from '~/Components'
</script>
Generics â
āĻā§āύā§āϰāĻŋāĻ āĻāĻžāĻāĻĒ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰāĻā§āϞāĻŋ <script>
āĻā§āϝāĻžāĻā§ generic
āĻ
ā§āϝāĻžāĻā§āϰāĻŋāĻŦāĻŋāĻāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĄāĻŋāĻā§āϞā§ā§āĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§:
vue
<script setup lang="ts" generic="T">
defineProps<{
items: T[]
selected: T
}>()
</script>
āĻāĻžāĻāĻĒāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ <...>
-āĻāϰ āĻŽāϧā§āϝ⧠āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āϞāĻŋāϏā§āĻā§āϰ āĻŽāϤā§āĻ generic
-āĻāϰ āĻā§āϝāĻžāϞ⧠āĻ āĻŋāĻ āĻāĻāĻāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§āĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻĒāύāĻŋ āĻāĻāĻžāϧāĻŋāĻ āĻĒā§āϝāϰāĻžāĻŽāĻŋāĻāĻžāϰ, extends
āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž, āĻĄāĻŋāĻĢāϞā§āĻ āĻāĻžāĻāĻĒāϏ āĻāĻŦāĻ āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻāĻŽā§āĻĒā§āϰā§āĻā§āĻĄ āĻāϰāĻž āĻāĻžāĻāĻĒāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
vue
<script
setup
lang="ts"
generic="T extends string | number, U extends Item"
>
import type { Item } from './types'
defineProps<{
id: T
list: U[]
}>()
</script>
āϝāĻāύ āĻāĻžāĻāĻĒāĻāĻŋ āĻ
āύā§āĻŽāĻžāύ āĻāϰāĻž āϝāĻžāϝāĻŧ āύāĻž, āϤāĻāύ āϏā§āĻĒāώā§āĻ āĻĒā§āϰāĻāĻžāϰ⧠āĻĒāĻžāϏ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻĒāύāĻŋ @vue-generic
āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻžāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
vue
<template>
<!-- @vue-generic {import('@/api').Actor} -->
<ApiSelect v-model="peopleIds" endpoint="/api/actors" id-prop="actorId" />
<!-- @vue-generic {import('@/api').Genre} -->
<ApiSelect v-model="genreIds" endpoint="/api/genres" id-prop="genreId" />
</template>
ref
-āĻ āĻāĻāĻāĻŋ āĻā§āύā§āϰāĻŋāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻĒāύāĻžāĻā§ vue-component-type-helpers
āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāĻŦā§ āĻāĻžāϰāĻŖ InstanceType
āĻāĻžāĻ āĻāϰāĻŦā§ āύāĻžāĨ¤
vue
<script
setup
lang="ts"
>
import componentWithoutGenerics from '../component-without-generics.vue';
import genericComponent from '../generic-component.vue';
import type { ComponentExposed } from 'vue-component-type-helpers';
// Works for a component without generics
ref<InstanceType<typeof componentWithoutGenerics>>();
ref<ComponentExposed<typeof genericComponent>>();
Restrictions â
- āĻŽāĻĄāĻŋāĻāϞ āĻāĻā§āϏāĻŋāĻāĻŋāĻāĻļāύ āĻļāĻŦā§āĻĻāĻžāϰā§āĻĨāĻŦāĻŋāĻĻā§āϝāĻžāϰ āĻĒāĻžāϰā§āĻĨāĻā§āϝā§āϰ āĻāĻžāϰāĻŖā§,
<script setup>
āĻāϰ āĻāĻŋāϤāϰā§āϰ āĻā§āĻĄ āĻāĻāĻāĻŋ SFC-āĻāϰ āĻĒā§āϰāϏāĻā§āĻā§ āύāĻŋāϰā§āĻāϰ āĻāϰā§āĨ¤ āĻŦāĻžāĻšā§āϝāĻŋāĻ.js
āĻŦāĻž.ts
āĻĢāĻžāĻāϞ⧠āϏāϰāĻžāύ⧠āĻšāϞā§, āĻāĻāĻŋ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻāĻŦāĻ āĻā§āϞ āĻāĻāϝāĻŧā§āϰ āĻāύā§āϝāĻ āĻŦāĻŋāĻā§āϰāĻžāύā§āϤāĻŋāϰ āĻāĻžāϰāĻŖ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻ āϤāĻāĻŦ,<script setup>
src
āĻ ā§āϝāĻžāĻā§āϰāĻŋāĻŦāĻŋāĻāĻā§āϰ āϏāĻžāĻĨā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻžāĨ¤ <script setup>
āĻāύ-āĻĄā§āĻŽ āϰā§āĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻā§āĻŽāĻĒā§āϞā§āĻ āϏāĻŽāϰā§āĻĨāύ āĻāϰ⧠āύāĻžāĨ¤(āϏāĻŽā§āĻĒāϰā§āĻāĻŋāϤ āĻāϞā§āĻāύāĻž)
GitHub-āĻ āĻāĻ āĻĒā§āώā§āĻ āĻžāĻāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰā§āύ