Vue 3 的组合式 API-hooks

Vue 3 的组合式 API

组合式 API 是 Vue 3 的核心特性之一,它允许开发者将组件的逻辑拆分为可复用的函数。组合式 API 的主要特点是

  • 逻辑复用:将逻辑提取到独立的函数中,方便在多个组件中复用。
  • 组织清晰:将相关的逻辑分组,而不是将逻辑分散到 data、methods、computed 等选项中。
  • 更接近函数式编程:通过函数组合的方式组织代码。

在 Vue 3 中,自定义 Hooks 是通过组合式 API 的 ref、reactive、watch、computed 等函数实现的

  • 基本的自定义 Hook
// useCounter.ts
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 };
}

在组件中使用:

<script setup>
import { useCounter } from './useCounter';const { count, increment, decrement } = useCounter(10);
</script><template><div><p>Count: {{ count }}</p><button @click="increment">Increment</button><button @click="decrement">Decrement</button></div>
</template>
  • 路由跳转
// useNavigation.ts
import { RouteLocationRaw } from 'vue-router'
import { useRouter } from 'vue-router'export function useNavigation() {const router = useRouter()// 基本跳转const navigateTo = (to: RouteLocationRaw) => {return router.push(to)}// 替换当前路由const replaceRoute = (to: RouteLocationRaw) => {return router.replace(to)}// 返回上一页const goBack = (delta = -1) => {router.go(delta)}// 前进const goForward = () => {router.go(1)}return {navigateTo,replaceRoute,goBack,goForward,router}
}

在组件中使用示例

<script setup lang="ts">
import { useNavigation } from '@/hooks/useNavigation'const {navigateTo,replaceRoute,goBack,goForward
} = useNavigation()// 路径跳转
const gotoHome = () => {navigateTo('/home')
}// 命名路由带参数
const gotoDetail = (id: string) => {navigateTo({name: 'Detail',params: { id }})
}// 带查询参数
const gotoSearch = (keyword: string) => {navigateTo({path: '/search',query: { q: keyword }})
}// 替换当前路由
const replaceToLogin = () => {replaceRoute('/login')
}
</script><template><button @click="gotoHome">首页</button><button @click="gotoDetail('123')">详情页</button><button @click="goBack">返回</button>
</template>
  • 消息提示hooks
/useMessage.ts
import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'
import { useI18n } from './useI18n'
export const useMessage = () => {const { t } = useI18n()return {// 消息提示info(content: string) {ElMessage.info(content)},// 错误消息error(content: string) {ElMessage.error(content)},// 成功消息success(content: string) {ElMessage.success(content)},// 警告消息warning(content: string) {ElMessage.warning(content)},// 弹出提示alert(content: string) {ElMessageBox.alert(content, t('common.confirmTitle'))},// 错误提示alertError(content: string) {ElMessageBox.alert(content, t('common.confirmTitle'), { type: 'error' })},// 成功提示alertSuccess(content: string) {ElMessageBox.alert(content, t('common.confirmTitle'), { type: 'success' })},// 警告提示alertWarning(content: string) {ElMessageBox.alert(content, t('common.confirmTitle'), { type: 'warning' })},// 通知提示notify(content: string) {ElNotification.info(content)},// 错误通知notifyError(content: string) {ElNotification.error(content)},// 成功通知notifySuccess(content: string) {ElNotification.success(content)},// 警告通知notifyWarning(content: string) {ElNotification.warning(content)},// 确认窗体confirm(content: string, tip?: string) {return ElMessageBox.confirm(content, tip ? tip : t('common.confirmTitle'), {confirmButtonText: t('common.ok'),cancelButtonText: t('common.cancel'),type: 'warning'})},// 删除窗体delConfirm(content?: string, tip?: string) {return ElMessageBox.confirm(content ? content : t('common.delMessage'),tip ? tip : t('common.confirmTitle'),{confirmButtonText: t('common.ok'),cancelButtonText: t('common.cancel'),type: 'warning'})},// 导出窗体exportConfirm(content?: string, tip?: string) {return ElMessageBox.confirm(content ? content : t('common.exportMessage'),tip ? tip : t('common.confirmTitle'),{confirmButtonText: t('common.ok'),cancelButtonText: t('common.cancel'),type: 'warning'})},// 提交内容prompt(content: string, tip: string) {return ElMessageBox.prompt(content, tip, {confirmButtonText: t('common.ok'),cancelButtonText: t('common.cancel'),type: 'warning'})}}
}

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

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

相关文章

Web渗透之XSS注入

XSS的类型 1、反射型XSS 我们构建好一个urlXSS的payload&#xff0c;发送给受害者&#xff0c;受害者点击恶意链接后会在受害者的浏览器上执行恶意代码。反射型XSS是一次性的&#xff0c;而且比较容易被发现。通常恶意链接会被修改成短链接&#xff0c;或钓鱼图片的形式。 2…

【Nginx】Nginx代理Tomcat配置及404问题解决

当Tomcat返回HTTP 404未找到错误时&#xff0c;可以通过以下两种方式设置跳转到指定地址&#xff1a; ① 在Tomcat应用内部配置错误页面跳转&#xff08;直接修改Tomcat的Web应用配置&#xff09; ② 在Nginx反向代理层拦截404错误并跳转&#xff08;无需修改Tomcat&#xff0c…

某公司网络OSPF单区域配置

1.配置背景&#xff1a; xx公司网络由三台路由器和一台交换机组成&#xff0c;现在想要三台路由器之间通过OSPF实现互连互通。 2.网络结构如下&#xff1a; 3.具体配置&#xff1a; 3.1路由器 RA 配置&#xff1a; 1.更改主机名称&#xff1a; Router>en Router#conf t…

电脑知识 | TCP通俗易懂详解 <一>

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f68d;什么是TCP/TCP协议 三、&#x1f9cd;‍♂为什么TCP可靠 1.&#x1f970;关于可靠 2.&#x1f920;哪里可靠 3.&#x1f393;️图片的三次握手&#xff0c;四次挥手 4.&#x1f4da;️知识点总结 四、&…

MyBatis 中 Mapper 传递参数的多种方法

# MyBatis Mapper 传递参数的多种方法及其优势 在使用 MyBatis 进行数据库操作时&#xff0c;Mapper 接口的参数传递是一个非常基础但又十分重要的部分。不同的参数传递方式适用于不同的场景&#xff0c;合理选择可以大大提高代码的可读性和维护性。本文将详细介绍几种常见的 …

Dify 插件开发笔记

Dify 插件开发 开发流程 #mermaid-svg-U9rSMmcbWvcGcFMu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-U9rSMmcbWvcGcFMu .error-icon{fill:#552222;}#mermaid-svg-U9rSMmcbWvcGcFMu .error-text{fill:#552222;st…

行星际激波在日球层中的传播:Propagation of Interplanetary Shocks in the Heliosphere (第二部分)

行星际激波在日球层中的传播&#xff1a;Propagation of Interplanetary Shocks in the Heliosphere &#xff08;第一部分&#xff09;- Chapter 1: Introduction & Chapter 2: Basics of Magnetohydrodynamics 行星际激波在日球层中的传播&#xff1a;Propagation of In…

巴法云平台-TCP设备云-微信小程序实时接收显示数据-原理

微信小程序通过WebSocket或HTTP长轮询连接平台&#xff08;而非直接使用TCP&#xff09;&#xff01;&#xff01;&#xff01; 物联网平台对协议层的一种封装设计——将底层通信协议&#xff08;如TCP&#xff09;与应用层业务逻辑&#xff08;如主题路由&#xff09;解耦&am…

QT Sqlite数据库-教程002 查询数据-上

【1】DQL语句&#xff1a; DQL语句&#xff08;数据查询语言&#xff09;&#xff0c;用来查询数据记录。DQL 基本结构由 SELECT FROM、WHERE、JOIN 等子句构成。DQL 语句并不会改变数据库&#xff0c;而是让数据库将查询结果发送结果集给客户端&#xff0c;返回的结果是一张虚…

基础数学:线性代数与优化理论

本篇文章简单带您复习线性代数与优化理论&#xff08;主要是我发表的文章中涉及过的或相关联的&#xff09; 微积分和概率与统计由此进&#xff1a;基础数学&#xff1a;微积分和概率与统计-CSDN博客 图论与信息论由此进&#xff1a;基础数学&#xff1a;图论与信息论-CSDN博…

java android持久化数据

1. SQLite 数据库&#xff08;Android 内置&#xff09; 1.1 创建数据库帮助类 public class DatabaseHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME "MyDatabase.db";private static final int DATABASE_VERSION 1;// 表名和列名…

鸿蒙动画与交互设计:ArkUI 3D变换与手势事件详解

大家好&#xff0c;我是 V 哥。 在鸿蒙 NEXT 开发中&#xff0c;ArkUI 提供了丰富的 3D 变换和手势事件功能&#xff0c;可用于创建生动且交互性强的用户界面。下面详细介绍 ArkUI 的 3D 变换和手势事件&#xff0c;并给出相应的 ArkTS 案例代码。 1. ArkUI 3D 变换 ArkUI 支…

HTTP 和 HTTPS 协议的区别及使用场景

在互联网的世界里,HTTP 和 HTTPS 是我们经常接触到的两种网络协议,它们在数据传输、安全性等方面存在诸多差异,适用的场景也各有不同。​ 一、HTTP 和 HTTPS 的基本概念​ HTTP,即超文本传输协议(Hyper - Text Transfer Protocol),是一种用于分布式、协作式和超媒体信息…

【微服务管理】注册中心:分布式系统的基石

在分布式系统日益普及的当下&#xff0c;如何高效地管理众多服务实例成为关键问题。注册中心应运而生&#xff0c;它犹如分布式系统的 “指挥中枢”&#xff0c;承担着服务注册、发现等核心任务&#xff0c;为整个系统的稳定运行和高效协作提供坚实保障。本文将深入探讨注册中心…

高并发短信系统设计:基于SharingJDBC的分库分表、大数据同步与实时计算方案

高并发短信系统设计&#xff1a;基于SharingJDBC的分库分表、大数据同步与实时计算方案 一、概述 在当今互联网应用中&#xff0c;短信服务是极为重要的一环。面对每天发送2000万条短信的需求&#xff0c;我们需要一个能够处理海量数据&#xff08;一年下来达到数千万亿级别&…

2025最新系统 Git 教程(七)(完结)

第4章 分布式Git 4.1 分布式 Git - 分布式工作流程 你现在拥有了一个远程 Git 版本库&#xff0c;能为所有开发者共享代码提供服务&#xff0c;在一个本地工作流程下&#xff0c;你也已经熟悉了基本 Git 命令。你现在可以学习如何利用 Git 提供的一些分布式工作流程了。 这一…

OpenCV 图像旋转

一、OpenCV 图像旋转介绍 在计算机视觉和图像处理领域&#xff0c;图像旋转是指将图像围绕某个中心点按照一定的角度进行转动。旋转操作会改变图像中像素的位置&#xff0c;从而得到新的图像布局。这一操作在很多场景中都有重要应用&#xff0c;比如文档矫正、目标检测时对图像…

<C#>在 .NET 开发中,依赖注入, 注册一个接口的多个实现

在 .NET 开发里&#xff0c;有时一个接口会有多个实现类&#xff0c;此时就需要向依赖注入容器注册多个实现。下面会详细介绍不同场景下如何注册多个实现&#xff0c;以及怎样从容器中解析这些实现。 1. 注册多个实现 在 .NET 中&#xff0c;依赖注入容器可以通过不同方式注册…

idea 保存格式化 但是不格式化 Xml

xml- 其他 - 保持空格勾选上 https://blog.csdn.net/m0_65724734/article/details/128378290?spm1001.2101.3001.6650.8&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-128378290-blog-135147277.235%5Ev43%5Epc_blog_bo…

如何在C++中优雅地绘制图表

如何在C项目中优雅地绘制图表 matplotlibpreparematplotlibcpp.hpython3vs configuretest Gnuplotpreparegnuplotgnuplot-iostream.hboostvs configuretest MathGL 在C项目中&#xff0c;在进行一些数据分析时往往不够直观&#xff0c;若能借助图表进行分析可以达到事半功倍的效…