热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue3自定义hook函数

使用场景在Vue3中,使用什么API就引入,这个就是组合式API。然而,有时引入很多的API就不利于代码的阅读。所以,在
使用场景

Vue3中,使用什么API就引入,这个就是组合式 API

然而,有时引入很多的API就不利于代码的阅读。
所以,在 Vue3 中新增了 Hook,可以通过自定义hook函数来存放组合式API的东西,在需要的时候再进行引用。

概念

hook :其本质是一个函数,把 setup 函数中使用的 Composition API 放到一个文件中进行了封装,然后在需要用到的地方,进行引入,类似于 vue2.x 中的 mixin

自定义hook的优势

自定义 hook 能够复用代码,让setup中的逻辑更清楚易懂。

实例

TestPage.vue

<template><p>The title is&#xff1a;{{ title }}</p><p>The currt count is&#xff1a;{{ currCount }}</p><a-button &#64;click&#61;"plusCount(3)" type&#61;"primary">click me plus count</a-button><a-button &#64;click&#61;"minusCount()">click me minus count</a-button><a-button &#64;click&#61;"set(5)" type&#61;"danger">click me set count</a-button><a-button &#64;click&#61;"reset" type&#61;"dashed">click me reset count</a-button>
</template><script lang&#61;"ts">
import { ref } from &#39;vue&#39;
import setCount from &#39;./hook/setCount&#39;export default {name: &#39;test&#39;,props: {msg: String,},setup() {const title &#61; ref(&#39;This is test page&#39;)const {current: currCount,plusCount,minusCount,set,reset,} &#61; setCount(2, {min: 1,max: 15,})return {title,currCount,plusCount,minusCount,set,reset,}},
}
</script>

/hook/setCount.ts&#xff1a;

import { ref, Ref, watch } from &#39;vue&#39;
// 使用 interface 接口定义入参Range
interface Range {min?: number,max?: number
}// 使用 interface 接口定义返回Result
interface Result {current: Ref<number>,plusCount: (delta?: number) &#61;> void,minusCount: (delta?: number) &#61;> void,set: (value: number) &#61;> void,reset: () &#61;> void
}export default function useCount(initialVal: number, range?: Range): Result {const current &#61; ref(initialVal)const plusCount &#61; (delta?: number): void &#61;> {if (typeof delta &#61;&#61;&#61; &#39;number&#39;) {current.value &#43;&#61; delta} else {current.value &#43;&#61; 1}}const minusCount &#61; (delta?: number): void &#61;> {if (typeof delta &#61;&#61;&#61; &#39;number&#39;) {current.value -&#61; delta} else {current.value -&#61; 1}}const set &#61; (value: number): void &#61;> {current.value &#61; value}const reset &#61; () &#61;> {current.value &#61; initialVal}watch(current, (newVal: number, oldVal: number) &#61;> {if (newVal &#61;&#61;&#61; oldVal) {return}if (range && range.min && newVal < range.min) {current.value &#61; range.min} else if (range && range.max && newVal > range.max) {current.value &#61; range.max}})return {current,plusCount,minusCount,set,reset}
}

在这里插入图片描述

有时候&#xff0c;一个组件里面可能会使用多个 hook&#xff0c;如下&#xff1a;

/hook/setStudent.ts&#xff1a;

import { reactive } from "vue";export default function() {let student &#61; reactive({name: "xiao ming",age:18, changeInfomation() {student.name &#61; "xiaofang"student.age &#61; 20}})return student;
}

修改 TestPage.vue&#xff1a;

<template><p>The title is&#xff1a;{{ title }}</p><p>The student name is:{{stu.name}}</p><p>The student age is:{{stu.age}}</p><a-button &#64;click&#61;"stu.changeInfomation" type&#61;"primary">click me change the student&#39;s information</a-button><p>The currt count is&#xff1a;{{ currCount }}</p><a-button &#64;click&#61;"plusCount(3)" type&#61;"primary">click me plus count</a-button><a-button &#64;click&#61;"minusCount()">click me minus count</a-button><a-button &#64;click&#61;"set(5)" type&#61;"danger">click me set count</a-button><a-button &#64;click&#61;"reset" type&#61;"dashed">click me reset count</a-button>
</template><script lang&#61;"ts">
import { ref } from &#39;vue&#39;
import setCount from &#39;./hook/setCount&#39;
import setStudent from &#39;./hook/setStudent&#39;export default {name: &#39;test&#39;,props: {msg: String,},setup() {const title &#61; ref(&#39;This is test page&#39;)const {current: currCount,plusCount,minusCount,set,reset,} &#61; setCount(2, {min: 1,max: 15,})return {title,currCount,plusCount,minusCount,set,reset,stu: setStudent(),}},
}
</script>

页面效果&#xff1a;
在这里插入图片描述

Hook 的特征之一&#xff1a;可以在组件外去写一些自定义 Hook&#xff0c;所以&#xff0c;不仅可以在.vue组件内部使用Vue的能力&#xff0c;而且&#xff0c;在任意的文件下&#xff08;如setCount.ts&#xff09;下也可以。


推荐阅读
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文讨论了为什么在main.js中写import不会全局生效的问题,并提供了解决方案。在每一个vue文件中都需要写import语句才能使其生效,而在main.js中写import语句则不会全局生效。本文还介绍了使用Swal和sweetalert2库的示例。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 本文介绍了如何按需加载elementui的部分模块,以及如何设置覆盖某些属性。通过import引入Dialog模块,并使用Vue.component进行全局设置。同时使用Vue.use引入ElementUI和VueAxios模块。通过extends进行属性覆盖设置。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • Vue3中setup函数的参数props和context配置详解
    本文详细介绍了Vue3中setup函数的参数props和context的配置方法,包括props的接收和配置声明,以及未通过props进行接收配置时的输出值。同时还介绍了父组件传递给子组件的值和模板的相关内容。阅读本文后,读者将对Vue3中setup函数的参数props和context的配置有更深入的理解。 ... [详细]
author-avatar
抓尼莫為生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有