Vue 3的Composition API和vue2的不同之处

news2024/12/25 13:31:56

        Vue 3的Composition API是Vue.js框架的一个重要更新,它提供了一种新的组件逻辑组织和复用方式。在Vue 2中,我们通常使用Options API(data、methods、computed等)来组织组件的逻辑,但这种组织方式在处理复杂组件时可能会导致代码分散和难以维护。Composition API的引入旨在解决这些问题,提供了一种更加灵活和高效的代码组织方式。
        在本篇文章中,我们将详细介绍Vue 3的Composition API与Vue 2的不同之处,并通过代码例子来展示其用法。


        一、响应式系统的变化
        Vue 2使用Object.defineProperty来实现响应式系统,而Vue 3引入了Proxy-based响应式系统。Proxy可以直接监听对象和数组的变化,而不需要像Vue 2那样为每个属性定义getter和setter。这使得Vue 3的响应式系统更加高效,特别是在处理大型数据集时。
        在Vue 2中,我们通常使用this来访问组件的响应式数据和方法。而在Vue 3的Composition API中,我们使用ref和reactive来创建响应式数据,使用setup函数来组织组件的逻辑。
        二、setup函数
        在Vue 3中,每个组件都可以定义一个setup函数,它是组件生命周期的一部分,在组件实例创建之前执行。setup函数是使用Composition API组织组件逻辑的地方,它接收两个参数:props和context。
        props是一个对象,包含了父组件传递给子组件的所有属性。context是一个普通的JavaScript对象,包含了attrs、slots和emit三个属性,分别用于访问组件的属性、插槽和事件。
        在setup函数中,我们可以使用ref和reactive来创建响应式数据,使用computed和watch来创建计算属性和侦听器,以及使用生命周期钩子函数来处理组件的生命周期事件。
        三、ref和reactive
        在Vue 3中,我们可以使用ref和reactive来创建响应式数据。ref用于创建一个响应式的引用对象,它可以是基本数据类型或对象类型。reactive用于创建一个响应式的对象,它只能是对象类型。
        下面是一个使用ref和reactive的例子:


import { ref, reactive } from 'vue';
export default {
  setup() {
    const count = ref(0);
    const state = reactive({
      name: 'Vue 3',
      age: 3
    });
    function increment() {
      count.value++;
    }
    return {
      count,
      state,
      increment
    };
  }
};


       

         四、computed和watch
        在Vue 3中,我们可以使用computed和watch来创建计算属性和侦听器。computed用于创建一个计算属性,它接收一个getter函数,并返回一个不可变的响应式引用对象。watch用于侦听一个响应式数据的变化,并在数据变化时执行一个回调函数。
        下面是一个使用computed和watch的例子:


import { ref, computed, watch } from 'vue';
export default {
  setup() {
    const count = ref(0);
    const doubled = computed(() => count.value * 2);
    watch(count, (newValue, oldValue) => {
      console.log(`Count changed from ${oldValue} to ${newValue}`);
    });
    function increment() {
      count.value++;
    }
    return {
      count,
      doubled,
      increment
    };
  }
};


        五、生命周期钩子函数
        在Vue 3中,我们可以使用生命周期钩子函数来处理组件的生命周期事件。生命周期钩子函数与Vue 2中的生命周期钩子类似,但需要从'vue'包中导入。
        下面是一个使用生命周期钩子函数的例子:


import { onMounted, onUpdated, onUnmounted } from 'vue';
export default {
  setup() {
    onMounted(() => {
      console.log('Component mounted');
    });
    onUpdated(() => {
      console.log('Component updated');
    });
    onUnmounted(() => {
      console.log('Component unmounted');
    });
    return {};
  }
};


        六、Composition API的优势
        Vue 3的Composition API相比于Vue 2的Options API具有以下优势:
        1. 逻辑复用:通过Composition API,我们可以将相同逻辑的代码片段组合在一起,而不必遵循Options API的固定结构。这极大地提高了代码的可读性和可维护性。
        2. 类型支持:Vue 3的Composition API在设计时就考虑了TypeScript的支持,提供了更好的类型支持,使得在使用TypeScript时可以获得更好的开发体验。
        3. 灵活性:Composition API提供了一种更加灵活的代码组织方式,使得开发者可以更好地组织和复用组件逻辑。
        总结
        Vue 3的Composition API是Vue.js框架的一个重要更新,它提供了一种新的组件逻辑组织和复用方式。通过setup函数、ref、reactive、computed、watch等API,我们可以更加灵活地组织和复用组件逻辑,提高代码的可读性和可维护性。Composition API的引入使得Vue 3在处理复杂组件逻辑时更加得心应手。此外,Composition API 还改善了类型支持,使得 Vue 3 与 TypeScript 的结合更加紧密,为大型项目和团队开发提供了更好的支持。
        七、与 Options API 的对比
        Vue 2 中的 Options API 是基于组件选项的组织方式,例如 `data`, `methods`, `computed`, `watch`, `lifecycle hooks` 等。每个选项都有自己的用途,而且它们是相互独立的。这种组织方式在简单组件中工作得很好,但在大型或复杂的组件中,可能会导致以下问题:
        1. 逻辑分散:相关的逻辑被分割到不同的选项中,使得理解和维护变得更加困难。
        2. 代码重用:在 Options API 中,代码重用通常需要使用混合(mixins)或高阶组件(Higher-Order Components, HOCs),这些方法都有其局限性,如命名空间冲突、隐式的依赖关系等。
        相比之下,Composition API 允许开发者将相关的逻辑放在一起,无论是计算属性、侦听器还是生命周期钩子,都可以在 `setup` 函数中声明和使用。这样,代码的组织更加清晰,重用也更加容易。
        八、迁移到 Composition API
        对于现有的 Vue 2 应用程序,迁移到 Vue 3 和 Composition API 并不是一个一键转换的过程。虽然 Vue 3 提供了兼容性构建,允许开发者逐步迁移,但迁移过程中仍需要手动调整代码。以下是一些迁移到 Composition API 时的建议:
        1. 逐步迁移:不需要一次性迁移整个应用程序。可以逐个组件地进行迁移,同时保持其他部分使用 Options API。
        2. 重构复杂组件:首先考虑重构那些逻辑复杂、难以维护的组件。
        3. 利用迁移工具:Vue 3 提供了一些迁移工具和指南,可以帮助开发者更顺利地完成迁移。
        九、示例:计数器组件
        下面是一个简单的计数器组件,分别使用 Vue 2 的 Options API 和 Vue 3 的 Composition API 实现。

//Vue 2 with Options API:

export default {
  data() {
    return {
      count: 0
    };
  },
  methods: {
    increment() {
      this.count++;
    }
  },
  mounted() {
    console.log('Component mounted');
  }
};

//Vue 3 with Composition API:

import { ref, onMounted } from 'vue';
export default {
  setup() {
    const count = ref(0);
    function increment() {
      count.value++;
    }
    onMounted(() => {
      console.log('Component mounted');
    });
    return {
      count,
      increment
    };
  }
};


        十、结论
        Vue 3 的 Composition API 为 Vue.js 带来了新的活力,它不仅解决了 Vue 2 中的一些问题,还提供了更多的灵活性和强大的类型支持。虽然迁移到新的 API 可能需要一些努力,但长远来看,这将使代码更加清晰、可维护,并为未来的项目开发打下坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1490904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端面试题 ===> 【JavaScript - 高级】

公众号:需要以下pdf,关注下方 2023已经过完了,让我们来把今年的面试题统计号,来备战今年的金三银四!所以,不管你是社招还是校招,下面这份前端面试工程师高频面试题,请收好。 JavaScr…

LED照明恒流驱动芯片特点解析与SM16306推荐

LED恒流驱动芯片 是一种电子芯片,用于控制和驱动LED灯,以保持电流恒定,从而使LED灯能够稳定工作。这种芯片具有多种功能,包括电源管理、过流保护和温度调节等。 在LED照明系统中,恒流驱动芯片是非常重要的组成部分。由…

32单片机基础:TIM输入捕获

指定的电平跳变,就是上升沿或者下降沿,可以通过程序设置 PWMI模式,就是PWM的输入模式,是专门为测量PWM频率和占空比设计的, 可配合主从触发模式 这两个功能结合起来,测量频率占空比就是硬件全自动运行的…

奥维云网权威发布 智能水洗集成灶是第四代集成灶

近日,奥维云网权威发布了《2024智能水洗蒸烤集成灶行业发展趋势白皮书》,自此,集成灶行业产品正式进入4.0水洗蒸烤时代! 冠军实力助力行业迭新换代 据《2024智能水洗蒸烤集成灶行业发展趋势白皮书》分析,国内集成灶产…

【Linux实践室】Linux常用命令

🌈个人主页:聆风吟 🔥系列专栏:Linux实践室、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 🔔Linux文件操作2.1.1 👻创建文件2…

Java对接快递100实时快递单号查询API接口

目录 1.引入依赖 2.定义配置信息 3.模块结构 4.Controller 5.Service实现类 6.返回数据dto以及dto中的数据dto 7.测试运行 今天也是接到了这个任务,官网有小demo,可以下载下来参考test中代码 官方文档地址: 实时快递查询接口技术文档…

探索Python编程世界:从入门到精通

一.Python 从入门到精通 随着计算机科学的发展,编程已经成为了一种必备的技能。而 Python 作为一种简单易学、功能强大的编程语言,越来越受到人们的喜爱。本文将为初学者介绍 Python 编程的基础知识,帮助他们踏入 Python 编程的大门&#xf…

Nexus Repository的搭建

一、前言 Nexus Repository用于管理maven的jar包。java开发程序员每天都在使用,但是自己搭建或者管理的就很少。除非你是系统架构师。因为这一套东西,基本是搭建一次就不需要人来搭建了,日后打开界面维护的机会也很少,我们只需要…

【QT】在窗口中添加按钮

在窗口中添加按钮 创建一个QT程序,首先要做什么? 先创建一个应用程序类创建一个窗口类 在窗口中添加按钮 添加头文件:#include 没有设置按钮标题的函数,是因为它继承了父类,设置标题的函数在父类中。 因为好多子类…

低代码平台开发——基于React(文末送书)

目录 小程一言适用对象本书达成 书籍介绍作者简介内容介绍书籍目录阅读指导 小程送书 小程一言 《低代码平台开发——基于React》这本书主要围绕低代码平台和React技术的结合展开,为读者提供了关于低代码平台开发的理论和实践知识。 ## 书中内容简介 书中内容分为…

[前端][死循环]问题发现[easyui]

文章目录 问题描述问题细节 解决思路综合分析 解决办法 问题描述 页面点击按钮跳转弹窗页面回显出数据 此弹窗页面中有年份,类型等,当选中年份/类型会重新触发回显方法(onSelect 中调用方法),回显对应年份/类型得数据 问题细节 最开始调试…

4G/5G执法记录仪、智能安全帽走国标GB28181接入海康、宇视等大平台,也可走平台与平台对接,以下级平台级联到上级大平台

AIoT万物智联,智能安全帽生产厂家,执法记录仪生产厂家,智能安全帽、智能头盔、头盔记录仪、执法记录仪、智能视频分析/边缘计算AI盒子、车载DVR/NVR、布控球、智能眼镜、智能手电、无人机4G补传系统等统一接入大型融合通信可视指挥调度平台VM…

RabbitMQ如何保证消息不丢

如何保证Queue消息能不丢呢? RabbitMQ在接收到消息后,默认并不会立即进行持久化,而是先把消息暂存在内存中,这时候如果MQ挂了,那么消息就会丢失。所以需要通过持久化机制来保证消息可以被持久化下来。 队列和交换机的…

WebGIS开发0基础必看教程:地图显示——通过行列号来换算出多种瓦片的URL之离线地图

1.前言 在前面我花了两个篇幅来讲解行列号的获取,也解释了为什么要获取行列号。在这一章,我将把常见的几种请求瓦片时的URL样式罗列出来,并且给出大致的解释。 我在这里将地图分为离线地图和在线地图。所谓离线地图,即保存在本地…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:文本通用)

文本通用属性目前只针对包含文本元素的组件,设置文本样式。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 属性 名称参数类型描述fontColorResourceColor设置字体颜色。 从API version 9开…

亚信安慧AntDB:数据库自主创新的缩影

AntDB作为一款自主研发的数据库系统,具备了国产化升级改造的核心能力。这款数据库系统通过不懈努力和持续探索,实现了从跟随他人到引领潮流的华丽转身。AntDB不仅仅是一种技术产品,更是体现了自主研发能力的缩影,体现了科技企业在…

动态规划:LeetCode第10题 正则表达式匹配

题目: 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 示例 1: …

express+mysql+vue,从零搭建一个商城管理系统10--添加商品

提示:学习express,搭建管理系统 文章目录 前言一、新建models/goods.js二、新建routes/goods.js三、添加goods表四、添加商品总结 前言 需求:主要学习express,所以先写service部分 一、新建models/goods.js models/goods.js con…

(二十一)从零开始搭建k8s集群——kubernates核心组件及功能介绍

前言 Kubernetes是一个可移植、可扩展、开源的平台,用于管理容器化的工作负载和服务,它促进了声明性配置和自动化。Kubernetes容器可以持续开发、集成和部署:可靠且频繁地构建和部署容器镜像,快速有效地回滚;开发与运…

【MGR】MySQL Group Replication快速开始

目录 17.2 Getting Started 17.2.1 Deploying Group Replication in Single-Primary Mode 17.2.1.1 Deploying Instances for Group Replication 17.2.1.2 Configuring an Instance for Group Replication Storage Engines Replication Framework Group Replication Sett…