迁移指南
! 涉及代码改动
setup替代之前的beforecreate和created, 建议将created换成beforeMountbeforeDestroy→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, 统一使用$slotvue2: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---
