Introduction
New to Vue.js? Check out our Essentials Guide to get started.
This guide is primarily for users with prior Vue 2 experience who want to learn about the new features and changes in Vue 3. This is not something you have to read from top to bottom before trying out Vue 3. While it looks like a lot has changed, a lot of what you know and love about Vue is still the same; but we wanted to be as thorough as possible and provide detailed explanations and examples for every documented change.
Overview
Start learning Vue 3 at Vue Mastery (opens new window).
Quickstart
If you want to quickly try out Vue 3 in a new project:
Via CDN:
<script src="https://unpkg.com/vue@next"></script>In-browser playground on Codepen (opens new window)
In-browser Sandbox on CodeSandbox (opens new window)
-
Scaffold via Vite (opens new window):
npm init vite hello-vue3 -- --template vue # OR yarn create vite hello-vue3 --template vue
-
Scaffold via vue-cli (opens new window):
npm install -g @vue/cli # OR yarn global add @vue/cli vue create hello-vue3 # select vue 3 preset
Migration Build
If you have an existing Vue 2 project or library that you intend to upgrade to Vue 3, we provide a build of Vue 3 that offers Vue 2 compatible APIs. Check out the Migration Build page for more details.
Notable New Features
Some of the new features to keep an eye on in Vue 3 include:
- Composition API
- Teleport
- Fragments
- Emits Component Option
-
createRendererAPI from@vue/runtime-core(opens new window) to create custom renderers - SFC Composition API Syntax Sugar (
<script setup>) - SFC State-driven CSS Variables (
v-bindin<style>) - SFC
<style scoped>can now include global rules or rules that target only slotted content (opens new window) - Suspense experimental
Breaking Changes
The following consists a list of breaking changes from 2.x:
Global API
- Global Vue API is changed to use an application instance
- Global and internal APIs have been restructured to be tree-shakable
Template Directives
v-modelusage on components has been reworked, replacingv-bind.synckeyusage on<template v-for>and non-v-fornodes has changedv-ifandv-forprecedence when used on the same element has changedv-bind="object"is now order-sensitivev-on:event.nativemodifier has been removedrefinsidev-forno longer register an array of refs
Components
- Functional components can only be created using a plain function
functionalattribute on single-file component (SFC)<template>andfunctionalcomponent option are deprecated- Async components now require
defineAsyncComponentmethod to be created - Component events should now be declared with the
emitsoption
Render Function
- Render function API changed
$scopedSlotsproperty is removed and all slots are exposed via$slotsas functions$listenershas been removed / merged into$attrs$attrsnow includesclassandstyleattributes
Custom Elements
- Custom element checks are now performed during template compilation
- Special
isattribute usage is restricted to the reserved<component>tag only
Other Minor Changes
- The
destroyedlifecycle option has been renamed tounmounted - The
beforeDestroylifecycle option has been renamed tobeforeUnmount - Props
defaultfactory function no longer has access tothiscontext - Custom directive API changed to align with component lifecycle and
binding.expressionremoved - The
dataoption should always be declared as a function - The
dataoption from mixins is now merged shallowly - Attributes coercion strategy changed
- Some transition classes got a rename
<TransitionGroup>now renders no wrapper element by default- When watching an array, the callback will only trigger when the array is replaced. If you need to trigger on mutation, the
deepoption must be specified. -
<template>tags with no special directives (v-if/else-if/else,v-for, orv-slot) are now treated as plain elements and will result in a native<template>element instead of rendering its inner content. - Mounted application does not replace the element it's mounted to
- Lifecycle
hook:events prefix changed tovnode-
Removed APIs
keyCodesupport asv-onmodifiers- $on, $off and $once instance methods
- Filters
- Inline templates attributes
$childreninstance propertypropsDataoption-
$destroyinstance method. Users should no longer manually manage the lifecycle of individual Vue components. - Global functions
setanddelete, and the instance methods$setand$delete. They are no longer required with proxy-based change detection.
Supporting Libraries
All of our official libraries and tools now support Vue 3, but some of them are still in beta or release candidate status. You'll find details for the individual libraries below. Most are currently distributed using the next dist tag on npm. We intend to switch to latest once all the official libraries have compatible, stable versions.
Vue CLI
As of v4.5.0, vue-cli now provides the built-in option to choose Vue 3 when creating a new project. You can upgrade vue-cli and run vue create to create a Vue 3 project today.
Vue Router
Vue Router 4.0 provides Vue 3 support and has a number of breaking changes of its own. Check out its migration guide (opens new window) for full details.
Vuex
Vuex 4.0 provides Vue 3 support with largely the same API as 3.x. The only breaking change is how the plugin is installed (opens new window).
Devtools Extension
We are working on a new version of the Devtools with a new UI and refactored internals to support multiple Vue versions. The new version is currently in beta and only supports Vue 3 (for now). Vuex and Router integration is also work in progress.
-
For Chrome: Install from Chrome web store (opens new window)
- Note: the beta channel may conflict with the stable version of devtools so you may need to temporarily disable the stable version for the beta channel to work properly.
For Firefox: Download the signed extension (opens new window) (
.xpifile under Assets)
IDE Support
It is recommended to use VSCode (opens new window) with our official extension Volar (opens new window), which provides comprehensive IDE support for Vue 3.
Other Projects
| Project | npm | Repo |
|---|---|---|
| @vue/babel-plugin-jsx | [GitHub (opens new window)] | |
| eslint-plugin-vue | [GitHub (opens new window)] | |
| @vue/test-utils | [GitHub (opens new window)] | |
| vue-class-component | [GitHub (opens new window)] | |
| vue-loader | [GitHub (opens new window)] | |
| rollup-plugin-vue | [GitHub (opens new window)] |
For additional information on Vue 3 compatibility with libraries and plugins, be sure to check out this issue in awesome-vue (opens new window).
© 2013–present Yuxi Evan You
Licensed under the MIT License.
https://v3.vuejs.org/guide/migration/introduction.html