【前端组件封装教程】第3节:Vue 3 Composition API 封装基础

🧭第3节:Vue 3 Composition API 封装基础

引言

🌟 大家好,我是老曹!在前两节课中,我们学习了组件封装的基础概念以及 Vue 和 React 的组件模型对比。今天我们将深入探讨 Vue 3 的核心特性之一------Composition API。Composition API 是 Vue 3 中引入的一种新的代码组织方式,它通过 setup 函数将逻辑与模板分离,使得复杂组件的开发更加灵活和可维护。本节课我们将全面解析 setuprefreactivewatch、生命周期钩子以及自定义 Hook 的封装方法,并结合实际案例帮助你掌握最佳实践。


🔑 1. setup 函数的核心作用

  • 🔹 什么是 setup
    setup 是 Vue 3 中用于替代 Options API 的入口函数,所有组件的逻辑都可以在 setup 中定义。它的主要特点是:

    • 提供了一个集中管理组件逻辑的地方。
    • 支持 TypeScript 类型推断,提升开发体验。
  • 🔹 基本用法

    setup 中,我们可以通过返回值将数据、方法等暴露给模板使用。

    • 示例代码

      html 复制代码
      <template>
        <div>
          <p>{{ count }}</p>
          <button @click="increment">增加</button>
        </div>
      </template>
      
      <script>
      import { ref } from 'vue';
      
      export default {
        setup() {
          const count = ref(0);
      
          const increment = () => {
            count.value++;
          };
      
          return { count, increment };
        }
      };
      </script>
  • 🔹 最佳实践

    • setup 中尽量避免直接操作 DOM,保持逻辑的纯度。
    • 使用 TypeScript 定义接口或类型,增强代码的可读性和健壮性。

📌 2. refreactive 的区别与使用

2.1 ref 的特点

  • 🔹 核心思想
    ref 是一个用于创建响应式数据的函数,适用于单个值(如数字、字符串)或简单的对象。

  • 🔹 使用场景

    • 当需要处理基本类型的响应式数据时,优先使用 ref

    • 访问 ref 的值时,需通过 .value 属性。

    • 示例代码

      javascript 复制代码
      import { ref } from 'vue';
      
      const count = ref(0);
      console.log(count.value); // 输出 0
      count.value++; // 更新值

2.2 reactive 的特点

  • 🔹 核心思想
    reactive 是一个用于创建响应式对象的函数,适用于复杂的嵌套数据结构。

  • 🔹 使用场景

    • 当需要处理对象或数组时,优先使用 reactive

    • 不需要通过 .value 访问属性。

    • 示例代码

      javascript 复制代码
      import { reactive } from 'vue';
      
      const state = reactive({ count: 0 });
      console.log(state.count); // 输出 0
      state.count++; // 更新值
  • 🔹 最佳实践

    • 对于简单数据,使用 ref;对于复杂数据,使用 reactive
    • 避免直接解构 reactive 对象,否则会失去响应性。

🦖 3. watch 的使用与优化

  • 🔹 核心思想
    watch 用于监听响应式数据的变化,并执行相应的副作用逻辑。

  • 🔹 基本用法

    • 监听单个数据。

    • 监听多个数据。

    • 示例代码

      javascript 复制代码
      import { ref, watch } from 'vue';
      
      const count = ref(0);
      
      watch(count, (newValue, oldValue) => {
        console.log(`count 从 ${oldValue} 变为 ${newValue}`);
      });
      
      count.value++; // 触发监听器
  • 🔹 最佳实践

    • 避免在 watch 中执行耗时操作,以免影响性能。
    • 使用 immediate: true 立即触发回调。
    • 使用 deep: true 深度监听复杂对象的变化。

🚀 4. 生命周期钩子的迁移与使用

  • 🔹 核心思想

    Vue 3 中的生命周期钩子被重新设计为组合式 API,通过 onMountedonUnmounted 等函数实现。

  • 🔹 常用钩子

    • onMounted:组件挂载完成后执行。

    • onUnmounted:组件卸载时执行。

    • onUpdated:组件更新时执行。

    • 示例代码

      javascript 复制代码
      import { onMounted, onUnmounted } from 'vue';
      
      onMounted(() => {
        console.log('组件已挂载');
      });
      
      onUnmounted(() => {
        console.log('组件已卸载');
      });
  • 🔹 最佳实践

    • 将生命周期逻辑封装到独立的函数中,提高复用性。
    • 避免在生命周期钩子中直接操作 DOM,优先使用 Vue 提供的指令或工具。

⚡ 5. 自定义 Hook 的封装与使用

  • 🔹 核心思想

    自定义 Hook 是一种将逻辑提取到独立函数中的方式,类似于 React 的自定义 Hook。通过自定义 Hook,可以显著提升代码的复用性和可维护性。

  • 🔹 封装示例

    • 创建一个计数器 Hook。

      javascript 复制代码
      import { ref } from 'vue';
      
      export function useCounter(initialValue = 0) {
        const count = ref(initialValue);
      
        const increment = () => {
          count.value++;
        };
      
        const decrement = () => {
          count.value--;
        };
      
        return { count, increment, decrement };
      }
    • 在组件中使用自定义 Hook。

      html 复制代码
      <template>
        <div>
          <p>{{ count }}</p>
          <button @click="increment">增加</button>
          <button @click="decrement">减少</button>
        </div>
      </template>
      
      <script>
      import { useCounter } from './useCounter';
      
      export default {
        setup() {
          const { count, increment, decrement } = useCounter(10);
          return { count, increment, decrement };
        }
      };
      </script>
  • 🔹 最佳实践

    • 自定义 Hook 的命名应以 use 开头,便于识别。
    • 将通用逻辑提取到独立的文件中,形成模块化结构。

🐻 6. 重难点分析

  • 🔹 重点

    掌握 setuprefreactivewatch 和生命周期钩子的基本用法,理解自定义 Hook 的设计理念。

  • 🔹 难点

    • 如何在复杂组件中合理组织逻辑,避免 setup 函数过于臃肿。
    • 如何在 watch 中优化性能,避免不必要的副作用。
  • 🔹 解决方案

    • 使用 TypeScript 明确类型,减少运行时错误。
    • 将逻辑拆分为多个小函数或自定义 Hook,提高代码的可读性。

📚 7. 总结

  • 🔹 回顾

    本节课我们全面解析了 Vue 3 Composition API 的核心特性,包括 setup 函数、refreactive 的使用、watch 的优化方法、生命周期钩子的迁移以及自定义 Hook 的封装技巧。这些知识点是构建高效、可维护组件的基础。

  • 🔹 展望

    下一节课我们将深入探讨如何利用 Composition API 实现复杂的状态管理和跨组件通信。


课后练习

💡 请完成以下任务:

  1. 使用 refreactive 分别实现一个计数器组件,比较两者的差异。
  2. 编写一个自定义 Hook,用于监听窗口大小变化,并在组件中展示当前宽度和高度。

希望老曹这节课能为你提供清晰的技术指导!🚀

相关推荐
BruceeLeee2 小时前
关于vue3中使用el-upload组件上传图片后删除和预览按钮不显示的问题
vue.js
源码宝2 小时前
企业项目级医院随访系统源码,患者随访管理系统,技术框架:Java+Spring boot,Vue,Ant-Design+MySQL5
java·vue.js·spring·程序·医院管理系统·随访·随访系统源码
answerball2 小时前
Webpack:从构建流程到性能优化的深度探索
javascript·webpack·前端工程化
LinXunFeng2 小时前
Flutter 拖拉对比组件,换装图片前后对比必备
前端·flutter·开源
BD_Marathon2 小时前
【PySpark】安装测试
前端·javascript·ajax
stu_kk2 小时前
Ecology9明细表中添加操作按钮与弹窗功能技术分享
前端·oa
dkgee2 小时前
如何禁止Chrome的重新启动即可更新窗口弹窗提示
前端·chrome
天若有情6733 小时前
新闻通稿 | 软件产业迈入“智能重构”新纪元:自主进化、人机共生与责任挑战并存
服务器·前端·后端·重构·开发·资讯·新闻
鱼干~3 小时前
electron基础
linux·javascript·electron