Vue3新特性与Composition API
目录
Vue3概述
Vue3主要新特性
| 特性 | 说明 |
|---|---|
| Proxy响应式 | 使用Proxy替代Object.defineProperty |
| Composition API | 新增组合式API,更灵活的代码组织 |
| Teleport | 原生支持将组件渲染到任意DOM |
| Suspense | 原生支持异步组件loading状态 |
| Fragment | 组件可以有多根节点 |
| 更好的TypeScript支持 | 完整TypeScript支持 |
| 更小更快的体积 | 优化后的打包体积 |
| 更强大的Tree-shaking | 更多API可以按需引入 |
Vue3 vs Vue2对比
| 方面 | Vue2 | Vue3 |
|---|---|---|
| 架构 | Options API | Composition API + Options API |
| 响应式 | Object.defineProperty | Proxy |
| 入口函数 | new Vue() | createApp() |
| 根节点 | 只能有一个根节点 | 支持多根节点(Fragment) |
| TypeScript | partial support | 完整支持 |
| 打包体积 | ~20KB | ~10KB |
| 虚拟DOM | 完整重写 | 优化重写 |
创建Vue3项目
使用Vite创建
1 | # npm |
项目结构
1 | my-vue3-app/ |
main.js对比
1 | // Vue2 - main.js |
1 | // Vue3 - main.js |
Composition API
为什么需要Composition API
1 | ┌─────────────────────────────────────────────────────────────┐ |
setup函数
1 | <!-- Vue3 --> |
setup执行时机
1 | setup() { |
setup与Options API共存
1 | export default { |
响应式API
ref和reactive
1 | import { ref, reactive, readonly, shallowRef, shallowReactive } from 'vue' |
toRef和toRefs
1 | import { toRef, toRefs, reactive } from 'vue' |
computed
1 | import { ref, computed } from 'vue' |
watch和watchEffect
1 | import { ref, reactive, watch, watchEffect } from 'vue' |
ref获取DOM
1 | <template> |
响应式检测
1 | import { isRef, isReactive, isReadonly, isProxy } from 'vue' |
生命周期
生命周期对比
| Vue2 | Vue3 (onXxx) | 说明 |
|---|---|---|
| beforeCreate | - | setup()替代 |
| created | - | setup()替代 |
| beforeMount | onBeforeMount | 挂载前 |
| mounted | onMounted | 挂载后 |
| beforeUpdate | onBeforeUpdate | 更新前 |
| updated | onUpdated | 更新后 |
| beforeDestroy | onBeforeUnmount | 卸载前 |
| destroyed | onUnmounted | 卸载后 |
| errorCaptured | onErrorCaptured | 错误捕获 |
| - | onRenderTracked | 渲染依赖追踪 |
| - | onRenderTriggered | 渲染触发更新 |
生命周期使用示例
1 | import { onMounted, onBeforeMount, onUpdated, onBeforeUpdate, onUnmounted, onBeforeUnmount } from 'vue' |
父子组件生命周期顺序
1 | 挂载阶段: |
依赖注入
provide和inject
1 | <!-- Ancestor.vue --> |
1 | <!-- Child.vue --> |
注入默认值
1 | // 第三个参数为默认值 |
Symbols作为注入Key
1 | // symbols.js |
Teleport
基本用法
1 | <!-- Modal.vue --> |
条件渲染
1 | <!-- 禁用Teleport --> |
多个Teleport到同一目标
1 | <!-- 多个teleport可以同时传送到同一目标 --> |
Suspense
异步组件加载
1 | <!-- AsyncComponent.vue --> |
1 | <!-- Parent.vue --> |
错误处理
1 | <template> |
全局API变化
createApp
1 | // Vue2 |
全局API对比
| Vue2 Global API | Vue3 Global API |
|---|---|
| Vue.config | app.config |
| Vue.component | app.component |
| Vue.directive | app.directive |
| Vue.mixin | app.mixin |
| Vue.use | app.use |
| Vue.prototype | app.config.globalProperties |
| Vue.filter | 已移除 |
全局配置
1 | const app = createApp(App) |
实例方法
1 | // 挂载 |
新组件
Fragment
1 | <!-- Vue2 - 需要单一根元素 --> |
keep-alive变化
1 | <!-- Vue3 - 使用include/exclude --> |
v-memo
1 | <!-- 缓存模板子树 --> |
总结
Composition API优势
- 更好的逻辑复用 - 通过函数组合实现逻辑复用
- 更好的类型推断 - setup函数的参数和返回值都可以类型化
- 更灵活的代码组织 - 相关逻辑可以放在一起
- 更好的Tree-shaking - 未使用的功能不会被打包
常用组合函数
1 | // useMouse.js |
相关链接
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Louyp!
评论
