热门标签 | 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;下也可以。


推荐阅读
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了如何使用vue-awesome-swiper组件,包括在main.js中引入和使用swiper和swiperSlide组件,以及设置options和ref属性。同时还介绍了如何在模板中使用swiper和swiperSlide组件,并展示了如何通过循环渲染swipes数组中的数据,并使用picUrl属性显示图片。最后还介绍了如何添加分页器。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
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社区 版权所有