迁移指南
! 涉及代码改动
setup
替代之前的beforecreate
和created
, 建议将created
换成beforeMount
beforeDestroy
→beforeUnmount
,destroyed
→unmounted
移除
Vue.component
,$on
$off
和$once
, 导致无法直接通过原型链
传递属性- 无法使用事件总线, 可使用第三方包
mitt
代替使用 - 挂载在
vue.prototype
身上的数据共享数据使用app.config.globalProperties
代替
- 无法使用事件总线, 可使用第三方包
移除
.sync
,v-model
改为与.sync
等同用法, 默认v-model
等同于v-model:modelValue
, 即vue 2
的:modelValue.sync
也就是:modelValue
+@update:modelValue
移除
$listeners
合并到$attrs
中,$attrs
现在包含了所有传递给组件的attribute
,包括class
和style
。vue2
:<组件 v-on="$linsteners" v-bind="$attrs" />
,jsx
中<组件 props={$props} attrs={$attrs} {...$linsteners} />
vue3
:<组件 v-bind="$attrs" />
,jsx
中<组件 {...$attrs} />
移除
$scopedSlots
, 统一使用$slot
vue2
:this.$scopedSlots.header
得到父组件传递的<template #header>xxx</template>
内容vue3
:this.$slots.header()
得到父组件传递的<template #header>xxx</template>
内容
jsx
中不在使用scopedSlots
传递插槽, 统一改为v-slots
移除
Vue.extend
, 直接使用createApp
代替,extend
选项还在- vue2:
const Profile = Vue.extend(组件);new Profile().$mount('#mount-point')
- vue3:
const Profile = createApp(组件);new Profile().$mount('#mount-point')
- vue2:
移除
hook:生命周期
事件,改为@vue:生命周期
- vue2:
@hook:updated
监听组件的updated
生命周期 - vue3:
@vue:updated
监听组件的updated
生命周期
- vue2:
移除
v-on
的数字 (即键码 keyCode) 修饰符, 仅支持按键修饰符- vue2:
v-on:keyCode.q
和v-on:keyup.page-down/@keyup.page-down
- vue3:
v-on:keypress.q
和v-on:keyup.page-down/@keyup.page-down
- vue2:
移除过滤器
filter
移除
$set
, 可以挂方法替代app.config.globalProperties.$set = (obj,key,value)=>obj[key]=value
移除. native, 现在绑在组件上的属性不会默认被根组件继承了
移除
v-on
的.native
修饰符除。新增Fragments
(片段):Vue 3 中添加了Fragments
,也称为空内容标签,允许组件返回多个根元素,不需要每个template
必须用单元素包裹了。移除
$children
新增 emits 选项, 可以声明组件可触发的事件,
emits: ['accepted']
'自定义指令修改:
- created→ 新增!在元素的 attribute 或事件监听器被应用之前调用。
- bind →beforeMount
- inserted →mounted
- beforeUpdate:新增!在元素本身被更新之前调用,与组件的生命周期钩子十分相似。
- update → 移除!该钩子与
updated
有太多相似之处,因此它是多余的。请改用updated
。 - componentUpdated →updated
- beforeUnmount:新增!与组件的生命周期钩子类似,它将在元素被卸载之前调用。
- unbind →unmounted
异步组件需要使用 defineAsyncComponent 包裹异步引入语句, 详见 [[vue#组件懒加载]]和 [[vue3#组件懒加载]]
修改 2. x 版本时,
template
不能设置 key, key 设置在template
的子节点上, 3. x 时<template v-for>
的key
应该设置在<template>
标签上 (而不是设置在它的子节点上)。修改
v-if
和v-for
优先级, 二者同时出现在同一个元素身上时,vue2.6 以下v-for
会优先作用。3. x 版本中v-if
优先高于v-for
。建议避免在同一元素上同时使用两者。获取路由实例与当前路由实例:vue 2 通过
this.$router/$route
获取 router 实例,vue 3 通过使用 getCurrentInstance/ userRoute 和 userRouter 方法获取当前组件实例/路由实例和当前路由实例
&
不需要代码改动修改, h 函数现在是全局导入, 不再传递给 render 函数
修改 ,对于
v-if
/v-else
/v-else-if
的各分支项key
将不再是必须的,因为现在 Vue 会自动生成唯一的key
。如果你手动提供key
,那么每个分支必须使用唯一的key
。你将不再能通过故意使用相同的key
来强制重用分支。- x 中,如果一个元素同时定义了
v-bind="object"
和一个相同的独立 attribute,那么这个独立 attribute 总是会覆盖object
中的绑定。3. X 版本根据绑定的声明顺序将决定它们如何被合并, 即v-bind="object"
在 bind 后则v-bind="object"
优先级高, 否则相反。
- x 中,如果一个元素同时定义了
所有依赖改为 esModule 形式, 方便树摇, 例如 vue 实例现在需要通过 createApp 创建
提供 composition api---