functional attribute on single-file component <template> is removed.
Vue 2
<!-- template --> <template functional> <component :is="`h${props.level}`" v-bind="attrs" v-on="listeners" /> </template> // script export default { props: ['level'] }
Vue 3
<!-- template --> <template> <component :is="`h${props.level}`" v-bind="$attrs" /> </template> // script export default { props: ['level'] }
functional option in components created by functions is removed.
Vue 2
export default { functional: true, props: ['level'], render(h, { props, data, children }) { return h(`h${props.level}`, data, children) } }
Vue 3
import { h } from 'vue' const DynamicHeading = (props, context) => { return h(`h${props.level}`, context.attrs, context.slots) } DynamicHeading.props = ['level'] export default DynamicHeading
New defunctional option in components created by functions is removed.
- component option renamed to loader,
- loader function does not inherently receive resolve and reject arguments and must return a Promise.
Vue 2
const asyncModal = () => import('./Modal.vue') // or const asyncModal = { component: () => import('./Modal.vue'), delay: 200, timeout: 3000, error: ErrorComponent, loading: LoadingComponent }
Vue 3
const asyncModal = defineAsyncComponent(() => import('./Modal.vue')) // or const asyncModalWithOptions = defineAsyncComponent({ loader: () => import('./Modal.vue'), delay: 200, timeout: 3000, errorComponent: ErrorComponent, loadingComponent: LoadingComponent })
Vue 2
const oldAsyncComponent = (resolve, reject) => { /* ... */ }
Vue 3
const asyncComponent = defineAsyncComponent( () => new Promise((resolve, reject) => { /* ... */ }) )
New emits option, similar to the existing props option, that can be used to define the events that a component can emit to its parent.
Vue 2
<!-- template --> <div> <p>{{ text }}</p> <button v-on:click="$emit('accepted')">OK</button> </div> // script export default { props: ['text'] }
Vue 3
<!-- template --> <div> <p>{{ text }}</p> <button v-on:click="$emit('accepted')">OK</button> </div> // script export default { props: ['text'] emits: ['accepted'] }