使用Composition API和setup语法糖重构Vue组件

2023-11-13

Vue3 引入了Composition API。它是一种更灵活的方式来组织和复用组件的逻辑,而不是依赖于传统的选项式API(如data, methods, computed等)。Composition API的核心是一个名为setup的函数,它可以在组件创建之前执行,并返回一个对象,该对象包含了组件所需的所有属性和方法。

Composition API 带来了什么好处

公众号:Code程序人生,个人网站:https://creatorblog.cn

Vue3比较大的改动就是引入了Composition API来替代之前Vue2开发组件的方式,那么我们需要探讨一下,Composition API有什么好处。

  • Composition API可以让我们按照功能来组织代码,而不是按照选项来分散代码。这样可以让代码更加清晰、可读和可维护,也可以避免一些命名冲突和重复代码的问题
  • Composition API可以让我们更容易地实现逻辑复用,因为它是基于函数的,我们可以把一些通用的逻辑封装成组合式函数,并在不同的组件中复用它们。这样可以减少代码量和提高效率。
  • Composition API可以让我们享受更好的类型推导,因为它是基于 TypeScript 的,我们可以利用 TypeScript 的强大特性来编写更健壮和安全的代码。
  • Composition APItree-shaking 友好,因为它只引入了需要的 API,而不是整个 Vue 对象。这样可以减少打包后的文件大小,提高性能。

什么是setup语法糖

Vue 3.2中,引入了一个新的特性,叫做setup语法糖。

它是一种更简洁和优雅的方式来使用Composition API,无需显式地定义和返回setup函数。

它允许我们直接在<script>标签内使用Composition API的特性,如ref, reactive, computed, watch, onMounted等,并且自动将它们暴露给模板。

如何使用Composition和setup重构Vue组件

为了演示如何使用Compositionsetup语法糖重构Vue组件,我们将以一个简单的计数器组件为例。这个组件使用了传统的选项式API,如下所示:

<template>
  <div>
    <button @click="increment">+</button>
    <span>{{ count }}</span>
    <button @click="decrement">-</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 0
    }
  },
  methods: {
    increment() {
      this.count++
    },
    decrement() {
      this.count--
    }
  }
}
</script>

要使用setup语法糖重构这个组件,我们需要做以下几个步骤:

  1. <script>标签上添加setup属性,表示我们要使用<script setup>语法糖。
  2. data选项中的状态变量用ref函数包裹,并直接赋值给一个常量。这样就可以将普通的值转换为响应式的引用,并且可以在模板中直接访问它们。
  3. methods选项中的方法直接定义为普通的函数,并且可以直接访问状态变量。
  4. 删除不再需要的export defaultreturn语句。

重构后的组件代码如下:

<template>
  <div>
    <button @click="increment">+</button>
    <span>{{ count }}</span>
    <button @click="decrement">-</button>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const count = ref(0)

function increment() {
  count.value++
}

function decrement() {
  count.value--
}
</script>

可以看到,使用<script setup>语法糖后,我们的组件代码变得更加简洁和清晰,也更容易理解和维护。

当然,这只是一个简单的例子,实际上我们还可以利用Composition API的其他特性来进一步优化和重构我们的组件逻辑,例如使用reactive, computed, watch, onMounted, provide, inject, useXXX等。

总结

本文介绍了如何使用Composition API重构Vue组件,并且介绍了一种更简洁和优雅的方式来使用Composition API,即<script setup>语法糖。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Composition API和setup语法糖重构Vue组件 的相关文章

  • 将鼠标悬停在图像上以显示按钮,并且将鼠标悬停在实际按钮上时不会触发

    我试图让按钮在悬停在图像上时出现 以下作品 jQuery show image mouseenter function jQuery the buttons animate opacity 1 1500 mouseout function
  • 如何从ArrayBuffer中获取二进制字符串?

    JavaScript中如何从ArrayBuffer中获取二进制字符串 我不想对字节进行编码 只需将二进制表示形式获取为字符串 提前致谢 以下代码将一致地转换ArrayBuffer to a String并再次返回 而不会丢失或添加任何额外的
  • 使用 javascript 调用 ViewComponent

    我有一个带有几个视图组件的网页 当我单击这些组件时 我会为其打开一个简单的编辑器 请参见下图 如果我编辑文本并按 Enter 键 我想重新渲染视图组件而不是孔页面 是否可以使用 javascript 调用视图组件来获得此行为 通过更新 您现
  • 最小的 ExtJS 包是什么?

    有谁知道 Ext JS 2 2 所需的最少文件吗 我知道 ExtJS 网站有一个功能 build http extjs com products extjs build ExtJS ext js 的小版本 作为 ext all js 的替代
  • 记录jQuery中调用的方法和参数

    假设我有 jQuery 并且加载了几个插件 我运行一些这样的代码 someSelector someMethod someParam someOtherParam someOtherSelector someOtherMethod anot
  • 为什么“dtoa.c”包含这么多代码?

    我将是第一个承认我对低级编程的整体知识有点稀疏的人 我理解许多核心概念 但我不经常使用它们 话虽这么说 我对需要多少代码感到非常惊讶dtoa c http www netlib org fp dtoa c 在过去的几个月里 我一直致力于用
  • 如何在 JavaScript 中构建一个计算数组中出现次数的对象?

    我想计算数组中某个数字出现的频率 例如 在Python中我可以使用Collections Counter创建一个字典 记录某个项目在列表中出现的频率 据我所知 JavaScript 是这样的 var array 1 4 4 5 5 7 va
  • 使用 easyXDM 调整 IFrame 大小

    我将 iFrame 代码提供给客户 以便他们可以显示我网站上的动态内容 我希望其页面上的 iFrame 能够调整大小以适合我的内容 我按照 easyXDM 网站的说明进行操作 但也许我遗漏了一些东西 我没有收到任何错误 但 iFrame 保
  • NodeJS 无法加载 css 文件

    所以我正在尝试制作一个 NodeJS 服务器 并且我尝试保留尽可能少的附加组件 但是 我遇到了一个问题 我似乎无法加载任何内容CSS我调用的文件HTML文件 该调用似乎确实由服务器处理 但它不会显示在浏览器中 My 网络服务器 js fil
  • Angular-Datatables + Angular-xeditable:取消可编辑行

    当组合 Angular DataTables 和 Angular XEditable 时 添加新行时会取消可编辑行 这是jsfiddle https jsfiddle net faj61h5d 10 示例操作如下 1 这是初始状态 2 将第
  • 正则表达式 - 避免表达式中出现字符串

    我正在尝试创建一个应该匹配以下情况的正则表达式 如果单词完全匹配 first second third 那么匹配应该失败 但如果它周围有任何字符 那么应该匹配该字符串 我还需要避免字符串中的某些字符集 如果这些字符是字符串的一部分 则匹配结
  • django ajax post 403被禁止

    使用 django 1 4 当我尝试从我的 javascript 做我的 django 服务器上的帖子时 我收到 403 错误 我的 get 工作正常 尽管问题仅出在帖子上 也尝试过 csrf exempt但没有运气 更新 我现在可以发布我
  • Rxjs 可观察等待直到满足某些条件

    我有以下重试逻辑来重试操作 对于单个请求来说它工作得很好 对于多个正在进行的请求 我想在重试之前等待现有的重试逻辑完成 handleError errors Observable
  • 如何使用 selenium 获取 javascript 结果?

    我有以下代码 from selenium import selenium selenium selenium localhost 4444 chrome http some site com selenium start sel selen
  • 对数字和字母元素的数组进行排序(自然排序)

    假设我有一个数组 var arr 1 5 ahsldk 10 55 3 2 7 8 1 2 75 abc huds 我尝试对其进行排序 我得到了类似的东西 1 1 10 2 2 3 5 55 7 75 8 abc ahsldk huds 注
  • 全局定义的 AngularJS 控制器和封装

    根据 AngularJS 的教程 控制器函数仅位于全局范围内 http docs angularjs org tutorial step 04 http docs angularjs org tutorial step 04 控制器函数本身
  • Tween JS 基础知识之三个 JS 立方体

    我是 Tween JS 的新手 尝试使用 Tween 制作一个向右移动的简单动画 下面是我在 init 函数中的代码 我使用的是三个 JS var geometry new THREE CylinderGeometry 200 200 20
  • 获取 2 个日期之间的月份名称

    我有两个约会from and to 我想获取这两个日期之间的所有月份名称 以下是我的代码 var monthNames January February March April May June July August September
  • 盒式捆绑包与 MVC4 捆绑包

    我目前正在开发一个原型 ASP NET MVC 3 解决方案 该解决方案将用作多个项目重写的基础 来自 Web 表单 我的目标之一是跨应用程序实现一些脚本管理 而不是我们目前没有的目标 MVC 3有一个缺陷恕我直言 如果您需要在部分视图或模
  • 我可以防止将 Leaflet 地图平移到世界边缘之外吗?

    有没有办法限制平移到世界边缘之外 在这幅画中 棕色是世界 灰色是虚空 我想让它不可能像这样平移 Leaflet 允许您控制地图抵抗被拖出边界的程度maxBoundsViscosity选项 值 0 到 1 将其设置为最大值会完全禁用拖动出界

随机推荐

  • TCP通信发送和接收数据(Socket、ServerSocket)、TCP通信案例

    目录 TCP TCP发送接收数据 发送数据 Socket 接收数据 ServerSocket TCP通信案例1 TCP接收数据后给出反馈案例2 TCP接收数据后给出反馈案例3 TCP接收数据后给出反馈案例4 TCP 概述 TCP通信协议是一
  • C++实现——三子棋游戏

    题目描述 两个人玩三子棋游戏 即在3 3的矩阵上下棋 一个人画叉一个人画圈 谁先出现成行或成列或成对角线三个相同的棋子就算谁赢 编写算法实现 判断给定棋局的状态 用1代表先手 2代表后手 出现的六种状态为 1won 2won x 代表棋局错
  • 爬虫逆向——某建筑市场监管平台的滑块验证码分析

    目录 网址链接 正文 一 思路分析 二 图片处理 三 完整代码 网址链接 aHR0cHM6Ly9nY3htLmh1bmFuanMuZ292LmNuL2RhdGFzZXJ2aWNlLmh0bWw bs64解密可见 正文 注 分步的代码为示例代
  • GD32F103与STM32F103的区别 2021.6.2

    GD32F103和STM32F103区别介绍 关键词Key words GD32F103 STM32F103 摘要Abstract 本文主要是GD32F103和STM32F103区别进行介绍 目录 简介 GD32和STM32的区别 2 1
  • 正交向量 正交矩阵

    如何判断向量正交 内积 对应位置相乘再求和 是内积 卷积 加上滑动窗口 判断向量是否正交 两个向量正交 求其内积 看是否为0 若为零 则正交 在空间上向量垂直就正交 例子 a 1 1 0 b 1 1 0 则内积 a b 1 1 1 1 0
  • Linux教程:如何使用kubeadm从头到尾搭建k8s单节点服务并部署dashboard

    前言 在以往教程中 我们使用的是Minikube快速搭建的k8s服务 但这种方式只能在开发环境中使用 并不推荐生产环境 官方的推荐的方案是采用kubeadm快速搭建 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工
  • 改造vue-element-admin 的登录功能,变成从后台数据库中验证登录

    改造vue element admin 的登录功能 变成从后台数据库中验证登录 首先了解登录时前段需要什么样的数据 要知道vue element admin 这个后台开发模板是集成非常多我们日常开发网站的基本功能 所以我们在改造登录功能的时
  • Leetcode26-28,这几道简单有趣的算法题你都会吗?

    26 删除排序数组中的重复项 题目要求 给定一个排序数组 你需要在原地删除重复出现的元素 使得每个元素只出现一次 返回移除后数组的新长度 不要使用额外的数组空间 你必须在原地修改输入数组并在使用O 1 额外空间的条件下完成 示例1 给定数组
  • flutter GestureDetector onTop 点击反应过慢

    如果你遇到过需要自己定义的带手势的view 发现点击几下可能只响应一次 很有可能是GestureDetector的child没有加背景 有时GestureDetector的child不需要加背景也可以点击 但是只可以点击child显示有内容
  • 几个常用数学知识点

    机器学习跟数学有着紧密的关系 因此掌握一些常用的数学知识点 有助于我们理解某些模型的底层相关原理 1 泰勒公式 2 驻点 极值点 鞍点 拐点 2 1 驻点 在数学 特别在微积分 函数在一点处的一阶导数为零 该点即函数的驻点 Stationa
  • MyBatis中的statementType详解

    在mapper文件中可以使用statementType标记使用什么的对象操作SQL语句 statementType 标记操作SQL的对象 取值说明 1 STATEMENT 直接操作sql 不进行预编译 获取数据 Statement 2 PR
  • 各种酒英文名

    okolehao 夏威夷烧酒 芋薯烧酒 orgeat 杏仁橘花香茶一种用于鸡尾酒和食物中的 含有桔子与杏仁的甜作料 杏仁糖浆 鸡尾酒的一种配料或食品的香料 不含酒精 杏仁桔花香茶 一种不含酒精的清凉甜饮料 ouzo 茴香烈酒 无色 不甜且有
  • 前端中的滴到思

    hping3 c 200000 d 12000 S w 64 p 801 flood rand source IP c 是数据包数量 d 是数据包的大小 S 是数据包的类型 w winsize 默认 64 p 目标网站的端口 flood 开
  • 解决Windows11系统缺少Windows.Data.Pdf.dll文件出现错误问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个Windows
  • nodeJS fs.writeFile 实现文字换行

    写文件遇见需要换行的情况就在需要换行的内容前面加换行符号就阔以了 简单 r n windows n linux r mac 下面是一个复制文件的方法 每次追加时间戳的时候希望他换行 gt appendFile 的时候内容前面加 r n co
  • php自动验证,ThinkPHP 自动验证及验证规则详解

    ThinkPHP 自动验证 ThinkPHP 内置了数据对象的自动验证功能来完成模型的业务规则验证 自动验证是基于数据对象的 而大多情况下数据对象是基于 POST表单 不是绝对的 创建的 基本的自动验证功能包括 必须字段 email邮箱格式
  • 使用 ChatGPT、Stable Diffusion、React 和 NodeJS 构建网站画廊

    TLDR 在本文中 您将学习如何构建一个 Web 应用程序 该应用程序使用 ChatGPT 和 Stable Diffusion 为您提供的任何网站描述生成徽标和合适的域名 介绍 人工智能正在接管世界 这些技术每天都在震撼着我们的世界 Ch
  • 家里用服务器放在哪个位置,路由器摆放在家中哪个位置好 路由器摆放位置【详解】...

    路由器摆放在家中哪个位置好 路由器的摆放位置其实非常讲究的 这里就给大家讲解下相关知识 一起来看看 其实wifi所发射的信号 也就是无线电波 向手机和收音机发射出的电磁波是一样的 但是呢wifi的信号相当的短 一般常见的话只有12公分左右
  • Windows Server 系列 - User logon name(pre-Windows 2000) 和 User logon name 的区别

    一 在Active Directory中一直疑惑User logon name pre Windows 2000 和 User logon name这两个字段的区别 详细如下 AD UI界面展示名称 AD 后端属性名称 User logon
  • 使用Composition API和setup语法糖重构Vue组件

    Vue3 引入了Composition API 它是一种更灵活的方式来组织和复用组件的逻辑 而不是依赖于传统的选项式API 如data methods computed等 Composition API的核心是一个名为setup的函数 它可