【JS】深度揭秘!Vue3 Composition API全面教程与实战案例,助你轻松把握前 ...

打印 上一主题 下一主题

主题 1876|帖子 1876|积分 5628

随着前端技能的不停发展,组件化编程已经成为主流。在 Vue2 中,Options API 的方式虽然直观,但在大型应用中轻易导致代码冗余和逻辑分散。而 Vue3 引入的 Composition API 则提供了一种更灵活、高效的组件逻辑组织方式,使得代码更易于维护和复用。那么,Composition API 究竟有哪些优势?如何在现实项目中应用呢?让我们一起深入探究!
更多实用工具

【OpenAI】获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!!
【VScode】VSCode中的智能AI-GPT编程利器,全面揭秘ChatMoss & ChatGPT中文版
【GPT-o1系列模型!支持Open API调用、自定义助手、文件上传等强大功能,助您提升工作效率!】>>>点击跳转 - CodeMoss & ChatGPT-AI中文版

什么是 Composition API

Composition API 是 Vue3 引入的一组新的 API,用于组织和复用组件逻辑。与传统的 Options API(如 data、methods、computed 等)不同,Composition API 通过函数式的方式将相关的逻辑组合在一起,使代码更具可读性和可维护性。
主要特点包罗:


  • 逻辑复用更便捷:通过组合函数(Composable Functions),可以轻松复用和共享逻辑。
  • 代码组织更清晰:将相关的状态和行为放在同一个函数中,减少了逻辑分散的问题。
  • TypeScript 更友好:更好地支持范例推导,提升开发体验。

Composition API 与 Options API 的对比

在 Vue2 中,Options API 是主要的组件定义方式,使用 data、methods、computed 等选项来组织组件逻辑。然而,随着组件规模增大,Options API 的代码轻易变得痴肥,逻辑分散难以维护。
特性Options APIComposition API逻辑复用通过 mixins 或高阶组件实现,较为复杂通过组合函数实现,简洁直观代码组织按选项组织(data、methods 等)按功能组织,逻辑更聚焦TypeScript 支持限定较多,范例推导困难更加友好,范例推导更精准可读性简单组件易读,复杂组件易乱无论组件大小,都保持良好可读性 Composition API 的核心概念

要全面把握 Composition API,起首需要理解其核心概念和根本用法。下面,我们将逐一解析这些关键点。
Setup 函数

setup 函数是 Composition API 的入口,用于替换 Options API 中的 data、methods 等选项。setup 在组件创建之前执行,是一个用于定义组件逻辑的地方。
示例:
  1. <template>
  2.   <div>
  3.     <p>{{ count }}</p>
  4.     <button @click="increment">增加</button>
  5.   </div>
  6. </template>
  7. <script>
  8. import { ref } from 'vue'
  9. export default {
  10.   setup() {
  11.     const count = ref(0)
  12.     const increment = () => {
  13.       count.value++
  14.     }
  15.     return {
  16.       count,
  17.       increment
  18.     }
  19.   }
  20. }
  21. </script>
复制代码
响应式数据:ref 和 reactive

响应式是 Vue 的核心特性之一。Composition API 提供了 ref 和 reactive 两种方式来定义响应式数据。


  • ref:用于创建根本范例的响应式数据。
  • reactive:用于创建对象或数组的响应式数据。
示例:
  1. import { ref, reactive } from 'vue'
  2. // 使用 ref 创建响应式基本类型
  3. const count = ref(0)
  4. // 使用 reactive 创建响应式对象
  5. const user = reactive({
  6.   name: '张三',
  7.   age: 25
  8. })
复制代码
盘算属性和侦听器:computed 和 watch

computed 用于创建盘算属性,基于其他响应式数据自动盘算其值,并在依靠变化时自动更新。watch 则用于侦听响应式数据的变化,并在变化时执行回调函数。

示例:
  1. import { ref, computed, watch } from 'vue'
  2. const count = ref(0)
  3. // 计算属性
  4. const doubleCount = computed(() => count.value * 2)
  5. // 侦听器
  6. watch(count, (newVal, oldVal) => {
  7.   console.log(`count 从 ${oldVal} 变为 ${newVal}`)
  8. })
复制代码
生命周期钩子

Composition API 提供了一系列生命周期钩子,如 onMounted、onUnmounted 等,用于在组件的不同生命周期阶段执行相应的逻辑。
示例:
  1. import { onMounted, onUnmounted } from 'vue'
  2. export default {
  3.   setup() {
  4.     onMounted(() => {
  5.       console.log('组件已挂载')
  6.     })
  7.    
  8.     onUnmounted(() => {
  9.       console.log('组件已卸载')
  10.     })
  11.   }
  12. }
复制代码
实战案例:使用 Composition API 开发 Todo 应用

通过一个现实的应用案例,我们将全面展示如何使用 Composition API 开发一个简单的 Todo 应用。这不仅可以大概资助你理解 Composition API 的根本用法,还能让你看到其在现实项目中的强大之处。
项目结构

为了保持项目的清晰和可维护性,我们将采用以下的项目结构:
  1. src/
  2. |-- components/
  3. |   |-- TodoList.vue
  4. |   |-- TodoItem.vue
  5. |-- composables/
  6. |   |-- useTodos.js
  7. |-- App.vue
  8. |-- main.js
复制代码
实现步调

创建响应式数据

起首,我们需要定义 Todo 项目的数据结构,并创建响应式的数据源。在 composables 目录下创建 useTodos.js,用于管理 Todo 相关的逻辑。
  1. // src/composables/useTodos.js
  2. import { ref, computed } from 'vue'
  3. export function useTodos() {
  4.   const todos = ref([
  5.     { id: 1, text: '学习 Vue3', completed: false },
  6.     { id: 2, text: '编写 Composition API 教程', completed: false }
  7.   ])
  8.   const newTodo = ref('')
  9.   const addTodo = () => {
  10.     if (newTodo.value.trim()) {
  11.       todos.value.push({
  12.         id: Date.now(),
  13.         text: newTodo.value,
  14.         completed: false
  15.       })
  16.       newTodo.value = ''
  17.     }
  18.   }
  19.   const removeTodo = (id) => {
  20.     todos.value = todos.value.filter(todo => todo.id !== id)
  21.   }
  22.   const completedCount = computed(() => {
  23.     return todos.value.filter(todo => todo.completed).length
  24.   })
  25.   const totalCount = computed(() => todos.value.length)
  26.   return {
  27.     todos,
  28.     newTodo,
  29.     addTodo,
  30.     removeTodo,
  31.     completedCount,
  32.     totalCount
  33.   }
  34. }
复制代码
添加和删除 Todo

在 TodoList.vue 中,我们将使用 useTodos 组合函数,来管理 Todo 项目的添加和删除逻辑。
  1. <!-- src/components/TodoList.vue -->
  2. <template>
  3.   <div>
  4.     <h2>我的 Todo 列表</h2>
  5.     <input v-model="newTodo" @keyup.enter="addTodo" placeholder="添加新的 Todo" />
  6.     <button @click="addTodo">添加</button>
  7.     <ul>
  8.       <TodoItem v-for="todo in todos" :key="todo.id" :todo="todo" @remove="removeTodo" />
  9.     </ul>
  10.     <p>已完成:{{ completedCount }}/总数:{{ totalCount }}</p>
  11.   </div>
  12. </template>
  13. <script>
  14. import { useTodos } from '../composables/useTodos'
  15. import TodoItem from './TodoItem.vue'
  16. export default {
  17.   components: { TodoItem },
  18.   setup() {
  19.     const { todos, newTodo, addTodo, removeTodo, completedCount, totalCount } = useTodos()
  20.     return { todos, newTodo, addTodo, removeTodo, completedCount, totalCount }
  21.   }
  22. }
  23. </script>
复制代码
过滤和盘算功能

在 useTodos.js 中,我们已经实现了 completedCount 和 totalCount 这两个盘算属性,用于统计已完成的 Todo 数量和总数量。在 TodoList.vue 中,我们展示了这些统计数据。
代码详解

通过上述步调,我们已经开端构建了一个功能完备的 Todo 应用。下面,我们将深入解析其中的关键代码,了解 Composition API 如何让代码更简洁、高效。
组合函数:useTodos.js

组合函数 useTodos 封装了全部与 Todo 相关的逻辑,包罗数据的管理、添加和删除功能、以及统计盘算。这种封装方式使得逻辑高度聚合,易于维护和复用。
  1. import { ref, computed } from 'vue'
  2. export function useTodos() {
  3.   const todos = ref([
  4.     { id: 1, text: '学习 Vue3', completed: false },
  5.     { id: 2, text: '编写 Composition API 教程', completed: false }
  6.   ])
  7.   const newTodo = ref('')
  8.   const addTodo = () => {
  9.     if (newTodo.value.trim()) {
  10.       todos.value.push({
  11.         id: Date.now(),
  12.         text: newTodo.value,
  13.         completed: false
  14.       })
  15.       newTodo.value = ''
  16.     }
  17.   }
  18.   const removeTodo = (id) => {
  19.     todos.value = todos.value.filter(todo => todo.id !== id)
  20.   }
  21.   const completedCount = computed(() => {
  22.     return todos.value.filter(todo => todo.completed).length
  23.   })
  24.   const totalCount = computed(() => todos.value.length)
  25.   return {
  26.     todos,
  27.     newTodo,
  28.     addTodo,
  29.     removeTodo,
  30.     completedCount,
  31.     totalCount
  32.   }
  33. }
复制代码
关键点解析:


  • 响应式数据定义:使用 ref 创建 todos 和 newTodo,确保它们的变化可以大概触发视图更新。
  • 添加 Todo:addTodo 方法查抄输入内容是否为空,制止添加空的 Todo 项目。
  • 删除 Todo:removeTodo 方法通过过滤掉指定 ID 的 Todo 项目实现删除功能。
  • 盘算属性:completedCount 和 totalCount 使用 computed 来自动盘算已完成的数量和总数量,制止手动管理状态。
组件中的组合函数应用

在 TodoList.vue 中,通过调用 useTodos,我们将全部的逻辑和数据引入组件,使得组件本身保持简洁,只负责展示和用户交互。
  1. import { useTodos } from '../composables/useTodos'
  2. export default {
  3.   setup() {
  4.     const { todos, newTodo, addTodo, removeTodo, completedCount, totalCount } = useTodos()
  5.     return { todos, newTodo, addTodo, removeTodo, completedCount, totalCount }
  6.   }
  7. }
复制代码
这种方式不仅提高了代码的复用性,还使得组件逻辑更加清晰,便于测试和维护。
Composition API 的高级用法

把握了根本的 Composition API 用法后,我们可以进一步探索其高级特性,提升开发效率。
自定义组合函数(Composable)

组合函数是 Composition API 的核心概念,通过将相关的逻辑封装在一个函数中,实现逻辑的复用和模块化。
示例:
假设我们有多个组件需要使用表单验证逻辑,我们可以创建一个组合函数 useFormValidation 来复用这部分逻辑。
  1. // src/composables/useFormValidation.js
  2. import { ref, computed } from 'vue'
  3. export function useFormValidation() {
  4.   const form = ref({
  5.     username: '',
  6.     email: ''
  7.   })
  8.   const errors = ref({})
  9.   const validate = () => {
  10.     errors.value = {}
  11.     if (!form.value.username) {
  12.       errors.value.username = '用户名不能为空'
  13.     }
  14.     if (!form.value.email) {
  15.       errors.value.email = '邮箱不能为空'
  16.     } else if (!/\S+@\S+\.\S+/.test(form.value.email)) {
  17.       errors.value.email = '邮箱格式不正确'
  18.     }
  19.     return Object.keys(errors.value).length === 0
  20.   }
  21.   return {
  22.     form,
  23.     errors,
  24.     validate
  25.   }
  26. }
复制代码
在组件中使用:
  1. <script>
  2. import { useFormValidation } from '../composables/useFormValidation'
  3. export default {
  4.   setup() {
  5.     const { form, errors, validate } = useFormValidation()
  6.     const submit = () => {
  7.       if (validate()) {
  8.         // 提交逻辑
  9.       }
  10.     }
  11.     return { form, errors, submit }
  12.   }
  13. }
  14. </script>
复制代码
依靠注入:provide 和 inject

provide 和 inject 允许组件在层级结构中共享依靠,而无需通过 props 或事件传递。这在大型应用中非常有效,特别是在需要跨多个层级传递数据时。
示例:
  1. // 父组件
  2. import { provide, ref } from 'vue'
  3. export default {
  4.   setup() {
  5.     const appName = ref('我的应用')
  6.     provide('appName', appName)
  7.   }
  8. }
  9. // 子组件
  10. import { inject } from 'vue'
  11. export default {
  12.   setup() {
  13.     const appName = inject('appName')
  14.     return { appName }
  15.   }
  16. }
复制代码
最佳实践与性能优化

应用 Composition API 时,遵循一些最佳实践不仅能提升代码质量,还能优化应用性能。
组织和复用代码



  • 组合函数模块化:将相关逻辑封装在独立的组合函数中,提升代码的可复用性和可维护性。
  • 制止过分抽象:虽然组合函数可以复用逻辑,但过分抽象可能导致代码难以理解,应在复用性和可读性之间找到均衡。
制止不须要的响应式

响应式数据会引入一定的性能开销,特别是在处理大量数据时。因此,合理选择响应式数据的范围和深度非常紧张。


  • 使用 shallowRef 和 shallowReactive:在不需要深度响应时,使用浅响应式引用。
  • 惰性盘算:仅在需要时进行盘算,制止不须要的盘算属性。
示例:
  1. import { shallowRef } from 'vue'
  2. const user = shallowRef({
  3.   name: '张三',
  4.   age: 25
  5. })
复制代码
更多实用工具

【OpenAI】获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!!
【VScode】VSCode中的智能AI-GPT编程利器,全面揭秘ChatMoss & ChatGPT中文版
【GPT-o1系列模型!支持Open API调用、自定义助手、文件上传等强大功能,助您提升工作效率!】>>>点击跳转 - CodeMoss & ChatGPT-AI中文版

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

怀念夏天

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表