Vue3.0新特性探索和迁移指南

vue3亮点

  • Performance:性能更比Vue 2.0强。
  • Tree shaking support:可以将无用模块“剪辑”,仅打包需要的。
  • Composition API:组合API
  • Fragment, Teleport, Suspense:“碎片”,Teleport即Protal传送门,“悬念”
  • Better TypeScript support:更优秀的Ts支持
  • Custom Renderer API:暴露了自定义渲染API

对于小型项目上述亮点感知不是很明显,这些亮点尤其突出体现在复杂业务场景的大型项目中,会带来更好的体验,对生产效率有较大提升。

其实上面这些亮点是尤大自己在直播的时候官方列出的一些亮点,查看详情点这里

下面主要介绍下vue3主要的一些变化

vue3一些主要变化

全局 API

调用 createApp 返回一个应用实例

import { createApp } from 'vue'

createApp(App).use(router).use(store).mount('#app')
2.x 全局 API 3.x 实例 API (app)
Vue.config app.config
Vue.config.productionTip 移除
Vue.config.ignoredElements app.config.isCustomElement
Vue.component app.component
Vue.directive app.directive
Vue.mixin app.mixin
Vue.use app.use
Vue.prototype app.config.globalProperties

全局 API Treeshaking

Vue2.x 用法

import Vue from 'vue'

Vue.nextTick(() => {
  // 一些和DOM有关的东西
})

在 Vue 3 中,全局和内部 API 都经过了重构,并考虑到了 tree-shaking 的支持。因此,全局 API 现在只能作为 ES 模块构建的命名导出进行访问。

import { nextTick } from 'vue'

nextTick(() => {
  // 一些和DOM有关的东西
})

Vue 2.x 中的这些全局 API 受此更改的影响:

  • Vue.nextTick
  • Vue.observable (用 Vue.reactive 替换)
  • Vue.version
  • Vue.compile (仅全构建)
  • Vue.set (仅兼容构建)
  • Vue.delete (仅兼容构建)

片段 & $attrs

现在 $attrs 包含传递给组件的所有 attribute,包括 class 和 style

需要注意的一点是,在 3.x 中,现在支持多个根节点,在定义有多个根节点的时候,需要显式定义 attribute 应该分布在哪里


自定义指令

API有如下变化,钩子函数参数不变

  • bind → beforeMount
  • inserted → mounted
  • beforeUpdate:新的!这是在元素本身更新之前调用的,很像组件生命周期钩子。
  • update → 移除!有太多的相似之处要更新,所以这是多余的,请改用 updated。
  • componentUpdated → updated
  • beforeUnmount:新的!与组件生命周期钩子类似,它将在卸载元素之前调用。
  • unbind -> unmounted

Data 定义

data 选项已标准化为只接受返回 object 的 function

mixin、extend 对于 data的合并是浅合并

vue3中不建议用mixin写法,用composition API 替代。

emits Option

子组件触发父组件事件需要传入 emits: []



事件 API

o n , on, onoff 和 $once 实例方法已被移除,应用实例不再实现事件触发接口。
即不能直接通过bus e m i t 、 emit、 emiton组件间通信了。官方推荐使用mitt 第三方库。类似的api,还是熟悉的味道~

import mitt from 'mitt'
const emitter = mitt()
// ...
emitter.emit('trigger', params)
// ...
emitter.on('trigger', callback)
// ...
emitter.off('trigger', callback)

函数式组件*

主要是无状态组件的差异:

  • functional attribute 在