【Vue3】Vue3中的组合式API是什么?hook是什么?什么是“组合式函数”?项目中如何使用自定义 hook 函数?

news2025/1/11 10:02:31

组合式API与hook

    • 一、什么是组合式 API?(composition-api)
    • 二、什么是组合式函数?(hook)
      • 2.1 无状态的函数(utils)
      • 2.2 有状态的函数(hooks)
      • 2.3 utils与hooks的联系与区别
        • 联系
        • 区别
        • 总结
        • 优势
    • 三、项目中如何使用自定义 hook 函数?
      • 鼠标跟踪器示例

一、什么是组合式 API?(composition-api)

组合式API(Composition API) 是一系列 API 的集合,使我们可以使用函数而不是声明选项的方式书写 Vue 组件。它是一个概括性的术语,主要包含三类API:

  • 响应式 API:例如 ref() 和 reactive(),使我们可以直接创建响应式状态、计算属性和侦听器。
  • 生命周期钩子:例如 onMounted() 和 onUnmounted(),使我们可以在组件各个生命周期阶段添加逻辑。
  • 依赖注入:例如 provide() 和 inject(),使我们可以在使用响应式 API 时,利用 Vue 的依赖注入系统。

组合式 API
在 Vue 3 中,组合式 API 基本上都会配合

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

// 响应式状态
const count = ref(0)

// 更改状态、触发更新的函数
function increment() {
  count.value++
}

// 生命周期钩子
onMounted(() => {
  console.log(`计数器初始值为 ${count.value}`)
})
</script>

<template>
  <button @click="increment">点击了:{{ count }} 次</button>
</template>

注意:虽然组合式API 的风格是基于函数的组合,但组合式 API 并不是函数式编程。组合式 API 是以 Vue 中数据可变的、细粒度的响应性系统为基础的,而函数式编程通常强调数据不可变。

二、什么是组合式函数?(hook)

组合式函数 (Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数和在组件中一样,你也可以在组合式函数中使用所有的组合式 API。

2.1 无状态的函数(utils)

当构建前端应用时,我们常常需要复用公共任务的逻辑。例如为了在不同地方格式化时间,我们可能会抽取一个可复用的日期格式化函数。这个函数封装了无状态的逻辑:它在接收一些输入后立刻返回所期望的输出。

例如:
在这里插入图片描述

2.2 有状态的函数(hooks)

相比之下,有状态逻辑的函数负责管理会随时间而变化的状态。
一个简单的例子是跟踪当前鼠标在页面中的位置。
在实际应用中,也可能是像触摸手势或与数据库的连接状态这样的更复杂的逻辑。

2.3 utils与hooks的联系与区别

联系

一般来说,我们开发中会自动抽象出逻辑函数放在 utils 中,utils 中放的纯逻辑,不存在属于组件的东西;
hooks 就是在 utils 的基础上再包一层组件级别的东西(钩子函数等)。

区别

hooks 中如果涉及到 refreactivecomputed 这些 api 的数据,那这些数据是具有响应式的,
utils 只是单纯提取公共方法就不具备响应式,

总结

hook 的本质是一个有状态的函数,把 setup 函数中使用的 Composition API 进行了封装。类似于 vue2.x 中的 mixin

优势

复用代码,让 setup 中逻辑更清楚易懂。

三、项目中如何使用自定义 hook 函数?

  1. src 下创建 hooks 文件夹
  2. hooks 文件夹中创建 usexxx.js 文件 (一般都以 use- 开头)
  3. usexxx.js 中进行函数封装,并暴露出来
  4. 记得在函数最后返回要用到的属性
  5. 最后在组件中导入它就可以使用了
    创建hooks

鼠标跟踪器示例

  1. 在hooks目录下创建useMouse.js
// mouse.js
import { ref, onMounted, onUnmounted } from 'vue'

// 按照惯例,组合式函数名以“use”开头
export function useMouse() {
  // 被组合式函数封装和管理的状态
  const x = ref(0)
  const y = ref(0)

  // 组合式函数可以随时更改其状态。
  function update(event) {
    x.value = event.pageX
    y.value = event.pageY
  }

  // 一个组合式函数也可以挂靠在所属组件的生命周期上
  // 来启动和卸载副作用
  onMounted(() => window.addEventListener('mousemove', update))
  onUnmounted(() => window.removeEventListener('mousemove', update))

  // 通过返回值暴露所管理的状态
  return { x, y }
}
  1. 在项目组件中使用
<script setup>
import { useMouse } from './mouse.js';

const { x, y } = useMouse();
</script>

<template>Mouse position is at: {{ x }}, {{ y }}</template>

https://juejin.cn/post/7208111879150993464
https://juejin.cn/post/7083401842733875208

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

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

相关文章

yolov5s模型剪枝详细过程(v6.0)

本文参考github上大神的开源剪枝项目进行学习与分享&#xff0c;具体链接放在文后&#xff0c;希望与大家多多交流&#xff01; 一、原模型训练 在官方源码上训练yolov5模型&#xff0c;支持v6.0分支的n/s/m/l模型&#xff0c;我这里使用的是v5s&#xff0c;得到后将项目clone到…

Cesium态势标绘专题-椭圆(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

图像处理之Hough变换检测直线

hough变换-直线检测 一、 前言二、Hough 变换三、直线检测四、代码实现1.hough检测2.画直线代码3.画hough空间代码4.检测结果 一、 前言 霍夫变换是一种特征检测(feature extraction)&#xff0c;被广泛应用在图像分析&#xff08;image analysis&#xff09;、计算机视觉(com…

[算法通关村] 1.2 链表的插入

上一节我们谈到了链表的概念&#xff0c;以及链表的创建方法&#xff0c;忘记的小伙伴可以复习一下&#xff1a; [算法通关村] 1.1 单向链表的创建 今天我们来探究一下链表的插入&#xff0c;链表的插入共有 3 种可能性&#xff0c;分别是在链表的头部插入、在中间插入&#x…

CMake学习-All in one

参考引用 CMake与Make最简单直接的区别通过例子学习CMakeLIO-SAM 1. 引言 1.1 什么是 CMake 1.1.1 CMake 背景 1.1.2 CMake 定义 CMake 是一个跨平台的安装&#xff08;编译&#xff09;工具&#xff0c;可以用简单的语句来描述所有平台的安装&#xff08;编译&#xff09;过…

基础算法-数组模拟队列

队列&#xff1a;先进先出 什么叫做队列&#xff1a; 就是一个特殊的数组。这个数组&#xff0c;最前面叫队头&#xff0c;最后面叫队尾。只允许在最后面添加元素&#xff0c;只允许在最前面删除元素。 解题思路&#xff1a; 用一个数组 q 保存数据。 用 hh 代表队头&…

关于PyTorch中一维卷积Conv1d的理解

首先明确一点&#xff0c;PyTorch中的一维卷积是从左往右做的&#xff0c;不是从上往下。 然后明确第二点&#xff0c;一维卷积和二维卷积最大的区别在于&#xff0c;一维卷积的卷积方向只有一个维度&#xff0c;一维卷积的卷积核不像二维卷积核一样可以左右和上下两个维度移动…

Mysql-主从复制与读写分离

Mysql 主从复制、读写分离 一、前言&#xff1a;二、主从复制原理1.MySQL的复制类型2. MySQL主从复制的工作过程;3.MySQL主从复制延迟4. MySQL 有几种同步方式&#xff1a;5.Mysql应用场景 三、主从复制实验1.主从服务器时间同步1.1 master服务器配置1.2 两台SLAVE服务器配置 2…

CRM系统化整合从N-1做减法实践 | 京东物流技术团队

1 背景 京销易系统已经接入大网、KA以及云仓三个条线商机&#xff0c;每个条线商机规则差异比较大&#xff0c;当前现状是独立实现三套系统分别做支撑。 2 目标 2022年下半年CRM目标是完成9个新条线业务接入&#xff0c;完成销售过程线上化&#xff0c;实现销售规则统一。 …

【Git】—— 分⽀的基本操作

目录 &#xff08;一&#xff09;理解分⽀ &#xff08;二&#xff09;创建分⽀ &#xff08;三&#xff09;切换分⽀ &#xff08;四&#xff09;合并分⽀ &#xff08;五&#xff09;删除分⽀ 总结 &#xff08;一&#xff09;理解分⽀ 本章开始介绍 Git 的杀⼿级功能之…

结构型设计模式:装饰器模式

设计模式专栏目录 创建型设计模式-单例模式/工厂模式/抽象工厂 行为型设计模式&#xff1a;模板设计模式/观察者设计模式/策略设计模式 结构型设计模式&#xff1a;装饰器模式 C#反射机制实现开闭原则的简单工厂模式 目录 设计模式专栏目录设计模式分类设计模式的设计原则装饰…

Java体系总览

一、基础篇 JVM JVM内存结构 堆、栈、方法区、直接内存、堆和栈区别 Java内存模型 内存可见性、重排序、顺序一致性、volatile、锁、final 垃圾回收 内存分配策略、垃圾收集器&#xff08;G1&#xff09;、GC算法、GC参数、对象存活的判定 JVM参数及调优 Java对象模型 …

windows环境下docker数据迁移到其他盘

docker安装在C盘&#xff0c;使用一段时间后&#xff0c;C盘爆满。因此想把C盘中的数据迁移到其他盘&#xff0c;以释放C盘空间。分为以下步骤&#xff1a; 1、启动docker软件&#xff0c;打开PowerShell并切换到Docker Compose配置文件的目录。 Docker Compose配置文件的目录…

zabbix监控docker容器

1、安装zabbix-agent2插件 需要被监控的主机安装zabbix-agent2插件&#xff0c;请参考另一篇博客进行安装。原有的zabbix-agent插件不支持docker容器的监控的。agent的功能&#xff0c;agent2也都有 http://t.csdn.cn/dccqw 并在被监控的主机中开放10050端口 firewall-cmd --z…

【雕爷学编程】Arduino动手做(171)---micro:bit 开发板2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#xff0c;这…

用于事实核查的知识图谱比较推理:问题定义和算法 7.24

用于事实核查的知识图谱比较推理&#xff1a;问题定义和算法 摘要介绍问题定义知识段&#xff08;Knowledge Segment KS&#xff09;共性不一致性集体共性集体不一致性成对比较推理集体比较推理 知识片段提取Predictate-Predictate Similarity特定边的知识段特定子图知识段 比较…

[巅峰极客2023]wp复现

文章目录 [巅峰极客2023]复现miscwelcomefoundmesong学生物 webunserializesql [巅峰极客2023]复现 misc welcome base64解码 foundme find.DMP文件 使用flag查找工具找到关键字&#xff1a; flag.avif 放入010中看到这个hint&#xff0c;找到好几个avif&#xff1a; 将他…

Shedskin 使用

Shedskin是一个编译器工具&#xff0c;可以将Python代码编译为C语言。先说结论吧&#xff0c;这玩意现在就只是个玩具&#xff0c;因为使用ShedSkin编译的程序不能自由使用Python标准库&#xff0c;目前只支持大约17个常用模块&#xff1a; bisect collections ConfigParser c…

4.python设计模式【建造者模式】

内容: 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。建造者模式与抽象工厂模式相似&#xff0c;也用来创建复杂对象。主要区分是建造者模式着重一步步构造复杂对象&#xff0c;而抽象工厂模式着重于多个系列的产品对象。角色&#xf…

嵌入式做单片机的门槛

我个人认为并不高&#xff0c;如果你非要有个量化的标准&#xff0c;那我觉得初中文凭都能学会并且能以此为生的程度。 文凭嘛&#xff0c;就是一张纸&#xff0c;并代表不了什么。 前几年&#xff0c;我接了一个帮研究生写毕业论文的单子&#xff0c;果然没让我失望&#xf…