# vue2 与 vue3 的区别

# 1、新特性

  • 组合式 API
  • 单文件组件中的组合式 API 语法糖 (<script setup>)
  • Teleport 组件,将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去
  • Fragments 片段,支持多根节点的组件
  • Emits 组件选项,用于声明由组件触发的自定义事件
  • 来自 @vue/runtime-core 的 createRenderer API 用来创建自定义渲染函数,可以应用于单元测试
  • CSS 中的 v-bind(),<style> 标签里面的 v-bind 可以绑定到 <script>里面声明的值
  • SFC <style scoped> 新增全局规则和针对插槽内容的规则
  • Suspense,实现顶层 await,会自动让该组件成为一个异步依赖

# 2、新的框架级别推荐

  • 新版本的 Router, Devtools & test utils 来支持 Vue 3
  • 构建工具链: Vue CLI -> Vite
  • 状态管理: Vuex -> Pinia
  • IDE 支持: Vetur -> Volar
  • 新的 TypeScript 命令行工具: vue-tsc
  • 静态网站生成: VuePress -> VitePress
  • JSX: @vue/babel-preset-jsx -> @vue/babel-plugin-jsx

# 3、全局 API

  • createApp,调用 createApp 返回一个应用实例
  • tree-shaking,全局 API 现在通过具名导出进行访问。不能使用 Vue.xxx

# 4、模板指令

  • v-model,同一个组件上使用多个 v-model 绑定,自定义 v-model 修饰符
  • key 使用改变:
    • 对于 v-if/v-else/v-else-if 的各分支项 key 将不再是必须的
    • <template v-for> 的 key 应该设置在 <template> 标签上 (而不是设置在它的子节点上)。
  • v-if 比 v-for 的优先级高
  • v-bind 合并行为,起决于声明顺序,会被后面声明的相同属性覆盖
  • v-on.native 移除

# 5、组件

  • 函数式组件,所有的函数式组件都是用普通函数创建的,不需要定义 { functional: true },它们将接收两个参数:props 和 context。context 参数是一个对象,包含组件的 attrs、slots 和 emit property。
  • 异步组件,新的 defineAsyncComponent 助手方法,用于显式地定义异步组件,Loader 函数本身不再接收 resolve 和 reject 参数,且必须返回一个 Promise
  • emits 选项,这个选项可以用来定义一个组件可以向其父组件触发的事件。

# 6、渲染函数

  • h 现在是全局导入,而不是作为参数传递给渲染函数
  • VNode 现在有一个扁平的 prop 结构
  • this.$slots 现在将插槽作为函数公开
  • 非兼容:移除 this.$scopedSlots
  • $listeners 对象在 Vue 3 中已被移除。事件监听器现在是 $attrs 的一部分
  • $attrs 现在包含了所有传递给组件的 attribute,包括 class 和 style

# 7、移除的 APIs

  • 不再支持使用数字 (即键码) 作为 v-on 修饰符
  • 不再支持 config.keyCodes
  • $on,$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口
  • 过滤器已移除,且不再支持,建议用方法调用或计算属性来替代
  • inline-template 对内联模板特性的支持已被移除。
  • $children 已移除
  • propsData 已移除

# 8、其他

  • data 选项,只接受返回 object 的 function,并操作现在是浅层次的而非深层次的
上次更新: 11/28/2023, 7:06:34 PM