对比 vue3 和 vue2

184 阅读2分钟

最近 vue3 已经发布为默认 vue 版本,官网暂时还没有中文版,本文是对官网文档的一个阅读记录,主要对比了2和3 差异

vue3的新特性

  • 使用 TS 开发
  • 不兼容 IE11
  • composition API
  • <script setup> 语法糖
  • reactive 响应系统
  • custom-renderer
  • Fragments
  • Teleport

怎么选 Options Api 和 Composition Api

  • 不使用构建工具、在低复杂度场景中使用 Options Api
  • 使用 vue 构建整个应用,使用 Composition Api + SFC

Options Api 和 Composition Api 特点

Options Api

  • 基于类的模型,对于 OOP 背景的开发者更友好。
  • 通过 watch、computed 抽象出响应系统的细节,对初学者更友好

Composition Api

  • 需要了解响应系统的原理才能有效使用
  • 直接在函数作用域内申明响应状态,更加灵活的组织和重用逻辑
  • 更好的类型推断和提示
  • 使用 tree sharking 能达到更小的打包体积

vue3 和 vue2 的区别

vue3 的很多改动都是为了消除 vue2 中 api 设计的不一致性。比如 v-model 和 .sync、slotsslots 和 scopedSlots、is 的用法等

  • 全局 App Instance 改为 createApp。config、component、directive、mixin、use、globalProperties 这些资源可以通过 app 隔离。
  • 组件 v-model 指令修改。原来的 value 和 input 改为 modelValue 和 update:modelValue。.sync 修饰符改为通过 v-model 实现。
  • key 值必须唯一,用来给 diff 提供提示。<template v-for> 时,key 最好放在 template 元素上,而不是子元素上
  • v-if 和 v-for 在同一个元素上时,v-if 的优先级较大
  • v-bind 动态绑定属性和属性绑定一起使用时,最终的绑定结果跟语法顺序有关
  • emits 选项定义组件时间,其他事件会被当做 native 事件绑定到组件根组件上
  • 函数组件只能使用纯函数,functional 选项被废除。推荐使用状态组件替换函数组件,因为函数组件的性能优势已经没有了
  • h 函数的获取由 render 函数参数改为全局导入。h 函数的 props 参数更加扁平化。h 的第一个参数不能直接传入组件名,需要使用 resolveComponent 函数将组件名解析为组件定义。
  • slotsslots 和 scopedSlots 统一改为 $slots。在 h 函数的第三个参数传入
  • attrsattrs 和 listeners 统一改为 attrs。配合inheritAttrs:false使用时,可以将父组件传入的属性和响应函数绑定到非根节点上。attrs。配合 inheritAttrs: false 使用时,可以将父组件传入的属性和响应函数绑定到非根节点上。attrs 内包含 class 和 style 属性,不再强制特殊处理到根节点
  • is 属性只能放在 <component> 标签上使用,用来指定当前标签要创建的组件名。在其他标签上使用只会被当成普通元素属性传入构造函数。vue 2中特殊标签必须使用 is 来替换的,改为使用 vue: 前缀
  • 移除 v-on 指令的 keyCodes 修饰符和 config.keyCodes
  • 移除组件实例的 onon、off和$once 方法,组件实例不再作为 event bus 使用 。
  • 移除 filters,使用函数或 computed 替代
  • 移除 $children
  • app 挂载时,由之前替换挂载点改为作为挂载点子元素插入