【Vue3基础】组合式API

vue3 优雅的拆分逻辑小技巧 逻辑拆分, vue2 使用 mixin,vue3 使用组合式函数 ,同时也是最小全局状态管理库; 阅读详情

组合式API

1.前言

在Vue3中,有一项对于开发者来说非常有意义的更新 — 组合式API。

在开始介绍之前,需要注意两点:

  • 选项式API和组合式API是两种不同的风格,但它们不是互斥而是并存的!
  • 在需要大量逻辑组合的场景,往往使用组合式API实现

2.组合式API与选项式API

首先是选项式API,基于这种风格开发的Vue应用如左图所示:

  • 各个选项都有固定的书写位置,如:data — 响应式数据、method — 写方法函数…对于一个功能模块,其相关逻辑的代码是分散的。
  • 优点在于:代码结构清晰。
  • 缺点在于:代码组织性差,相似的逻辑代码不方便复用,逻辑复杂时,代码庞大,同一功能模块的上下文代码难以关联。

其次是组合式API,基于这种风格开发的Vue应用如右图所示:

  • 特定功能模块的相关代码都可以写在一块儿,同一功能的代码集中。
  • 优点在于:
    • 可以快速定位到某个功能模块的相关代码
    • 当逻辑复杂、代码量较大时,可以进行逻辑拆分、功能封装
      在这里插入图片描述
      当逻辑较为复杂时,我们可以进行功能的抽象和拆分,如下图:
      在这里插入图片描述
2.1 案例

光看图只能做到简单了解,下面我们通过一个具体的实例来体会一下两种开发风格的区别:
在这里插入图片描述

这里有两个独立的功能:

  1. 点击按钮控制div的显示与隐藏
  2. 点击按钮控制div内字体颜色的变化
2.3 利用选项式API实现
<template>
  <div>
    <!-- 功能一模板 -->
    <button @click="show">显示</button>
    <button @click="hide">隐藏</button>
    <div v-if="showDiv">一个被控制显隐的div</div>
  </div>
  <div>
    <!-- 功能二模板 -->
    <button @click="changeRed">红色</button>
    <button @click="changeYellow">蓝色</button>
    <div :style="`color:${fontColor}`">一个被控制字体颜色的的div</div>
  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      showDiv: true, // 功能一数据
      fontColor: '' // 功能二数据
    }
  },
  methods: {
    // 功能一方法
    show() {
      this.showDiv = true
    },
    hide() {
      this.showDiv = false
    },
    // 功能二方法
    changeRed() {
      this.fontColor = 'red'
    },
    changeYellow() {
      this.fontColor = 'blue'
    }
  }
}
</script>
2.4 利用组合式API实现
<template>
  <div>
    <!-- 功能一模板 -->
    <button @click="show">显示</button>
    <button @click="hide">隐藏</button>
    <div v-if="showDivFlag">一个被控制显隐的div</div>
  </div>
  <div>
    <!-- 功能二模板 -->
    <button @click="changeRed">红色</button>
    <button @click="changeBlue">蓝色</button>
    <div :style="`color:${fontColor}`">一个被控制字体颜色的的div</div>
  </div>
</template>

<script>
import { ref } from 'vue'
export default {
  name: 'App',
  setup() {
    // 功能一
    const showDivFlag = ref(true)
    function show() {
      showDivFlag.value = true
    }
    function hide() {
      showDivFlag.value = false
    }
    // 功能二

    const fontColor = ref('')
    function changeRed() {
      fontColor.value = 'red'
    }
    function changeBlue() {
      fontColor.value = 'blue'
    }
    return { showDivFlag, show, hide, fontColor, changeRed, changeBlue }
  }
}
</script>

接下来我们对上面的代码进行一下优化:

<script>
import { ref } from 'vue'
function useShow() {
  const showDivFlag = ref(true)
  function show() {
    showDivFlag.value = true
  }
  function hide() {
    showDivFlag.value = false
  }
  return { showDivFlag, show, hide }
}

function useColor() {
  const fontColor = ref('')
  function changeRed() {
    fontColor.value = 'red'
  }
  function changeBlue() {
    fontColor.value = 'blue'
  }
  return { fontColor, changeRed, changeBlue }
}
export default {
  name: 'App',
  setup() {
    // 功能一
    const { showDivFlag, show, hide } = useShow()
    // 功能二
    const { fontColor, changeRed, changeBlue } = useColor()
    return { showDivFlag, show, hide, fontColor, changeRed, changeBlue }
  }
}
</script>

通过定义功能函数,把俩个功能相关的代码各自抽离到一个独立的小函数中,然后通过在 setup 函数中再把俩个小功能函数组合起来,这样一来,我们既可以把 setup 函数变得更为简单清晰,又可以方便维护快速定位功能位置。

当然,这里只是一个小示例而已,在真实的开发过程中,对于多个不同且彼此独立的功能,往往会将其抽象为几个组件,然后分别在对应的组件中编写其内部逻辑代码,最后在父页面中,引入它们的数据、方法,来实现整体需求。

不过,这里并没有涉及到组合式API中的细节,仅仅是进行一个整体的体会。

下面的部分会对组合式API的基础进行简要的介绍。

3.组合式API基础

3.1 setup函数
  1. setup 函数是一个新的组件选项,作为组件中组合式API的起点(入口)
  2. setup 中不能使用this,this指向undefined
  3. setup函数只会在组件初始化的时候执行一次
  4. setup函数在beforeCreate生命周期钩子执行之前执行

不过现在使用更多的应该是<script setup>语法糖,即下面这种形式:

<script setup>
// 变量
const msg = 'Hello!'
// 函数
function log() {
  console.log(msg)
}
    
//...
</script>

里面的代码会被编译成组件setup()函数的内容。这意味着与普通的<script>只在组件被首次引入的时候执行一次不同,<script setup>中的代码会在每次组件实例被创建的时候执行。

当使用<script setup>的时候,任何在<script setup>声明的顶层的绑定 (包括变量,函数声明,以及 import 引入的内容) 都能在模板中直接使用!

3.2 ref和reactive函数

它们均用于将普通数据转换为响应式数据。

具体内容和区别等可以看这篇文章:【Vue3基础】ref 和 reactive

3.3 toRef函数

toRef方法用于转换响应式对象中的某一个属性为单独的响应式数据,并且,这两者的数据是关联的!

<script setup>
import { reactive, toRef } from 'vue'
const obj = reactive({
    name: 'xiaoming',
    info: {
        age: '10',
        sex: 'male',
    },
})

// 如果需要使用info数据,不能直接解构!例如:const { name } = obj
// 因为直接解构出来的数据不再具有响应式的特性,会变成一个普通数据!
// 隐藏这里就需要用toRef函数
const name = toRef(obj, 'name')
const info = toRef(obj, 'info')

// 更新该数据,原本的响应式对象中的对应属性也会变化
const update = () => {
    name.value = 'xiaowang';
    info.value.age = '14';
}

return { name, updateName };
</script>
3.4 toRefs函数

上面说到过,对于响应式对象,如果将其解构或展开,会让数据丢失响应式的能力!

而在某些场景中,解构或展开该对象又是不可避免的,因此,为了解决这个问题,引入了toRefs函数,使用该函数可以保证该对象展开的每个属性都是响应式的。

<script setup>
import { reactive, toRefs } from 'vue'
const obj = reactive({
    name: 'xiaoming',
    info: {
        age: '10',
        sex: 'male',
    },
})

// 这里需要将obj对象的各属性返回,因此使用扩展运算符是最为简单方便的
// 但扩展运算符会导致展开的数据失去响应式特性,所以需要配置toRefs函数使用
return { ...toRefs(obj) };
</script>
3.5 生命周期

在这里插入图片描述

需要注意的是,在组合式API中,可以多次使用同一个生命周期钩子函数,其执行顺序和书写顺序相同。

3.5 补充

首先是关于v-model语法糖调整:

  1. 在vue2.0中v-mode语法糖简写的代码 <Son :value="msg" @input="msg=$event" />
  2. 在vue3.0中v-model语法糖有所调整:<Son :modelValue="msg" @update:modelValue="msg=$event" />

在实际应用中,常常用在父子组件通信中,通过在子组件身上绑定:modelValue="msg"来传递数据,子组件中则在适当的地方用emit('update:modelValue', xxx)更新数据(也可以理解为向父组件传递数据)。

其次是一些其它内容:

Vue3中的 computed、watch 和 watchEffect — 【Vue3基础】Vue3中的 computed、watch 和 watchEffect

Vue3 组件通信 — 【Vue3基础】Vue3 组件间通信

Vue3 Provide/Inject — 【Vue3基础】依赖注入 — Provide/Inject

Vue3 mixins —

Vue快速入门(三)——组合式API常见问题 组合式 API (Composition API) 是一系列 API 的集合,使我们可以使用函数而不是声明选项的方式书写 Vue 组件。响应式 API:例如 ref() 和 reactive(),使我们可以直接创建响应式状态、计算属性和侦听器。生命周期钩子:例如 onMounted() 和 onUnmounted(),使我们可以在组件各个生命周期阶段添加逻辑。依赖注入:例如 provide() 和 inject(),使我们可以在使用响应式 API 时,利用 Vue 的依赖注入系统。 阅读详情

相关推荐

LLM推理服务中的SLO感知调度优化实践

在AI服务架构中,服务级别目标(SLO)是衡量服务质量的核心指标,特别是在大型语言模型(LLM)推理场景下。SLO通常涉及TTFT(首token时间)、TPOT(每token生成时间)和端到端延迟等关键维度,这些指标直接影响用户体验和系统效率。传统FCFS调度策略由于缺乏SLO感知能力,在混合负载下往往导致资源利用率低下和SLO达标率骤降。通过引入基于模拟退火的动态调度算法和精准的延迟预测模型,可以实现对不同优先级请求的智能调度,显著提升GPU利用率和SLO达标率。这种技术方案特别适用于需要同时处理实时对话

weixin_42549154的博客 369

VUE之组合式API

在使用vue的7大属性来组织逻辑时都很有效,但是当我们的组件开始变大的时候,逻辑关注点的列表也会不断增长,因此对于同一个业务逻辑可能造成东一块西一块,这样项目便不容易维护,组合式API的出现就是为了解决这种问题,它可以把相关业务逻辑组合在一起,最终项目易于维护vue的新属性setup其会在组件被创建之前执行——经验证setup函数会在beforeCreated函数之前执行在setup函数中应尽量避免使用this,因为他不会找到组件实例,setup的调用发生在data、methods等被解析之前。

m0_60027772的博客 4279

数字IC设计——功耗分析

功耗是数字IC芯片的一个重要指标

知识,既贵,又便宜。 9361

Vue组合式API

本文为大家介绍了Vue组合式API,希望对你有帮助~~

weixin_53919192的博客 7473

mmdetection 实战:基于Mask R-CNN与自定义COCO数据集的目标检测全流程解析

本文详细解析了如何使用mmdetection框架和Mask R-CNN模型,基于自定义COCO数据集完成目标检测任务的全流程。内容涵盖环境搭建、数据格式转换、配置文件定制化、模型训练与评估等核心步骤,并提供了针对工业缺陷检测场景的实用调优思路与避坑指南,帮助开发者高效构建高性能检测模型。

weixin_29046611的博客 136

433M无线遥控器EV1527协议解码实战:从逻辑分析到代码优化

本文详细解析了433M无线遥控器EV1527协议的实战解码过程。从使用逻辑分析仪抓取波形、理解同步头与数据位编码原理开始,逐步深入代码实现。文章重点对比了原始定时器轮询法的痛点,并提出了基于“边沿捕获+时间戳”的优化方案,构建了高效、可移植且具备抗干扰能力的解码引擎,最后分享了跨平台移植的核心技巧。

weixin_29168813的博客 927

Vue3选项式API和组合式API详解

对于熟悉使用Vue2的小伙伴来说,我们在Vue2项目中使用的就是组合式API。整个组件像是被一项一项配置出来的。data(){return {count:10,price:9.9,},computed:{sun:()=>{},watch:{/*这里有1000行代码………*/methods:{console.log("总价已更新为:",this.sum);

qq_41765777的博客 5660

RK3588网络调试笔记:当我把默认RTL8211F PHY换成另一款时,踩了哪些坑?

本文详细记录了在RK3588平台上将默认RTL8211F PHY芯片替换为其他型号的全过程,包括硬件设计验证、内核驱动适配、复位时序配置等关键步骤。通过实际案例分享,提供了从驱动调试到硬件优化的系统性解决方案,帮助开发者高效完成PHY芯片替换,确保网络接口稳定性。

weixin_30291791的博客 669

零基础入门uniapp Vue3组合式API版本

小程序学习笔记,课程来源up主咸虾米_。仅记录笔记,大家想学习可以去关注他。1.已安装HBuider X(目前是4.36版本),微信开发者工具(但还没注册小程序码),相关配置OK了。

qq_32765617的博客 949

similarity network fusion for aggregating data types on a genomic scale

基因组规模上的聚合数据类型的相似性网络融合 摘要:         近期的技术已经使收集不同类型的全基因组数据十分划算,结合这些数据去创建一个给定的疾病或生物过程的一个全面视图的计算方法是有必要的。相似网络融合(SNF:similarity network fusion)通过创建每一个可利用的数据类型的样本(如,患者)的网络可以解决这个问题。例如,创建一个给定一群患者疾病的全面视图,SNF计算

augustar学习笔记 7869

RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)

本文记录的是利用中的模块优化的目标检测网络模型。通过局部特征提取器、周围环境提取器、联合特征提取器和全局环境提取器来提取局部特征、周围环境和全局环境信息,充分利用不同层次的信息。本文将其应用到中,并进行二次创新,使网络能够更好的处理多类别目标的分类能力。CGNet: A Light-Weight Context Guided Network for Semantic Segmentation1️⃣ 首先通过局部特征提取器floc(∗)floc(*)floc(∗)和周围环境提取器fsur(∗)f_{sur }

Limiiiing的博客 1349

Vue3入门组合式API基础

例如,要实现一个计数器功能,可在setup中定义count变量和increment方法:首先通过ref函数创建响应式变量const count = ref(0)(ref用于处理基本类型响应式),再定义const increment = () => { count.value += 1 }(修改ref变量需通过.value访问),最后返回{ count, increment },模板中就能直接使用{{ count }}和@click="increment"。

2511_93165837的博客 248

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

vue3学习日记2 - 组合式API基础学习

vue3/组合式API入口:setup、组合式API - reactive和ref的认识、computed计算属性、watch函数、生命周期函数、父子通信 - 父传子、父子通信 - 子传父、模板引用、provide和inject

weixin_53468073的博客 877

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

vue3组合式API基础小记

Vue Composition API 文档(简称 VCA) 如果使用vue的组合式API进行开发,需要使用到此文档 在setup()中是没有this的 Vue 3 文档 基本可以做到vue2 -> vue3 无痛切换 可能在main.js里面需要注意 vue-router4 文档 使用方法基本无差 如果你在使用VCA组合式API进行编写组件,就不能延续之前的写法(如: this.$router),就需要使用useRouter,文档 ...

与世无争的垃圾 849

通过 Vue 3 组合式 API 优化 Uni-app 基础页面功能

Uni-app 是一个跨平台的应用开发框架,支持同时开发小程序、App 和 H5 等多个平台。而 Vue 3 的组合式 API 则是 Vue 3 新增的特性之一,它可以让我们更好地组织和复用组件逻辑。本文将结合 Vue 3 的组合式 API,来优化 Uni-app 中基础页面的功能实现。

nbsaas-boot基于Request-Response的企业级快速开发框架 1359

uniapp零基础入门Vue3组合式API语法版本开发咸虾米壁纸项目实战

今天给大家带来的是零基础入门uniapp,课程采用的是最新的Vue3组合式API版本,22年发布的uniappVue2版本获得了官方推荐,有很多同学等着我这个vue3版本的那,如果没有学过vue2版本也没关系,因为这门课程知识点更全更详细,项目案例也更完整。

嗨,大家好,我是爱搞知识的咸虾米 3307

vue3学习笔记(一)组件基础+路由+组合式API+Pinia

基础知识在vue2,这里仅记录vue3改动部分

kianagrow的博客 2677

vue3组合式api基础(常用)

vue3组合式api基础(常用)

jwq 1427

vue3.0组件API风格以及组合式API响应式基础

vue组件API风格介绍

qq_43628158的博客 1551

vue3基础+进阶(二、vue3常用组合式api基本使用)

vue3 常用api的基本使用

qq_45796592的博客 2483

VUE3语法基础 组合式api

首先创建一个完成项目,创建项目。打开src,找到app.vue,删除script、template、style标签里的内容。

mecende的博客 1231

前端必学Vue3 组合式 API 的基础 —— setup

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Vue3 组合式 API 的基础 —— setup一、setup 是什么二、组合api特点三、setup()四、ref值类型 响应对象五、reactive引用类型 响应式六、watch监听七、watchEffect监听效果八、computed计算九、生命周期十、全局配置十一、getCurrentInstance获取当前实例十二、setup使用vuex十三、setup(props,context)参数 一、setup 是什么 示例:pand.

python2021_7的博客 1586

Vue3组合式API(基础语法介绍)

基本类型对象类型对象对象类型。

weixin_69203733的博客 2380

Vue3基础-组合式 API 基础之setup

setup ref 生命周期钩子 watch computed

龙衣 642

Vue3 基础语法:从 Vue2 选项式 API 平滑过渡到组合式 API

本文通过对比Vue2选项式API和Vue3组合式API的代码实现,帮助开发者快速掌握Vue3新特性。文章以"计数器+用户信息"为例,展示了两种写法在数据定义、方法声明、计算属性等方面的差异,重点说明Vue3将逻辑集中管理、无需this访问变量的优势。同时提醒新手注意Vue3需要手动引入API、避免使用this等注意事项,并建议通过TodoList练习巩固知识,为后续学习响应式API打下基础。

爱好分享,不设VIP文章 833
上一篇: 【工程化】如何搭建一个项目的网络请求
下一篇: 【JS基础】JS扩展运算符与剩余运算符
cannotbecounted
博客等级 码龄7年 101粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值