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,并操作现在是浅层次的而非深层次的