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.
Start learning Vue 3 at Vue Mastery.
In-browser playground on Codepen
Scaffold via Vite:
npm init vite-app hello-vue3 # OR yarn create vite-app hello-vue31
Scaffold via vue-cli:
npm install -g @vue/cli # OR yarn global add @vue/cli vue create hello-vue3 # select vue 3 preset1
# Notable New Features
Some of the new features to keep an eye on in Vue 3 include:
- Composition API
- Emits Component Option
@vue/runtime-coreto create custom renderers
- SFC Composition API Syntax Sugar (
<script setup>) experimental
- SFC State-driven CSS Variables (
<style vars>) experimental
<style scoped>can now include global rules or rules that target only slotted content
# Breaking Changes
We are still working on a dedicated Migration Build of Vue 3 with Vue 2 compatible behavior and runtime warnings of incompatible usage. If you are planning to migrate a non-trivial Vue 2 app, we strongly recommend waiting for the Migration Build for a smoother experience.
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
<template v-for>and non-
v-fornodes has changed
v-forprecedence when used on the same element has changed
v-bind="object"is now order-sensitive
v-forno longer register an array of refs
- Functional components can only be created using a plain function
functionalattribute on single-file component (SFC)
functionalcomponent option are deprecated
- Async components now require
defineAsyncComponentmethod to be created
# Render Function
- Render function API changed
$scopedSlotsproperty is removed and all slots are exposed via
# Custom Elements
- Custom elements whitelisting is now performed during template compilation
isprop usage is restricted to the reserved
# Other Minor Changes
destroyedlifecycle option has been renamed to
beforeDestroylifecycle option has been renamed to
defaultfactory function no longer has access to
- Custom directive API changed to align with component lifecycle
dataoption should always be declared as a function
dataoption from mixins is now merged shallowly
- Attributes coercion strategy changed
- Some transition classes got a rename
- 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-slot) are now treated as plain elements and will result in a native
<template>element instead of rendering its inner content.
- In Vue 2.x, application root container's
outerHTMLis replaced with root component template (or eventually compiled to a template, if root component has no template/render option). Vue 3.x now uses application container's
innerHTMLinstead - this means the container itself is no longer considered part of the template.
# Removed APIs
- $on, $off and $once instance methods
- Inline templates attributes
$destroyinstance method. Users should no longer manually manage the lifecycle of individual Vue components.
# Supporting Libraries
All of our official libraries and tools now support Vue 3, but most of them are still in beta status and distributed under the
next dist tag on NPM. We are planning to stabilize and switch all projects to use the
latest dist tag by end of 2020.
# Vue CLI
As of v4.5.0,
vue-cli now provides built-in option to choose Vue 3 preset 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 README for full details.
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.
# 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
- 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 (
.xpifile under Assets)
# IDE Support
# Other Projects