iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3编程流畅技巧自定义Hooks
  • 196
分享到

Vue3编程流畅技巧自定义Hooks

2024-04-02 19:04:59 196人浏览 独家记忆
摘要

目录vue3自定义Hooks让写Vue3更畅快Vue3自定义Hooks定义:为什么Vue3要用自定义Hook?:写Vue3请摆脱Vue2无脑this的思想:几张动图复习Composi

Vue3自定义Hooks让写Vue3更畅快

hook: 直译[hʊk] 钩子

Hooks在前端领域并没有明确定义,借用知乎大佬的定义:在js里是callback,事件驱动,集成定义一些可复用的方法。

Vue3官方文档并没有对自定义Hooks做任何定义,却无处不在在使用这个技巧,很多开源项目也在用这个技巧,所以作为一个合格的Vuer学会自定义Hooks让Composition Api写起来更丰满是十分必要的!(飞机-官方文档在偷偷使用自定义Hooks)

Vue3自定义Hooks定义:

个人理解:一些可复用的方法像钩子一样挂着,可以随时被引入和调用以实现高内聚低耦合的目标,应该都能算是hook;

为什么Vue3要用自定义Hook?:

结论:就是为了让Compoosition Api更好用更丰满,让写Vue3更畅快!像写诗一样写代码! 其实这个问题更深意义是为什么Vue3比Vue2更好!无外呼性能大幅度提升,其实编码体验也是Vue3的优点**Composition Api的引入(解决Option Api在代码量大的情况下的强耦合)** 让开发者有更好的开发体验。

个人碎碎念:但是这些所谓的提高开发体验都是需要开发者不断学习养成编码好习惯,同样是Vue3写Compoosition Api有的人就能写得和诗一样,有的人却能写得像?一样(衷心希望每个开发者都有一颗对技术热衷的心,不要为了开发而开发,前人写翔让后人尝!抱歉最近因为维护老项目太多感慨)

写Vue3请摆脱Vue2无脑this的思想:

写Vue2中很多同学养成了 Option Api无脑this的习惯,来到Vue3的Composition Api还是习惯性想用this,更有人为了写this不惜引入getCurrentInstance!这大可不必!

Composition Api的优点之一就是摆脱无脑this导致的强耦合,功能之间互相this,变量和方法在各个方法混杂,无处不在的this是强耦合的,虽然方便,但是碎片化的option api 后期维护是麻烦的。

我相信写Vue2的同学,一定深有感触,一个组件下定义大量变和大量方法,方法嵌套方法,方法之间互相共享变量,维护这样的代码,看似容易理解的Option Api写法,我们需要在methos、data、template之间来回切,Option Api这种写法,代码量和功能小巧时是十分简单明了的,但是代码量一多,功能一复杂,我相信review代码的时候头都痛。

相对的Composition Api在功能复杂、代码量巨大的组件下,我们配合自定义Hooks,将代码通过功能分块写,响应变量和方法在一起定义和调用,这样后期我们改功能A只需要关注功能A块下的代码,不会像Vue2在Option Api需要同时关注methos和data。。。。。

几张动图复习Composition Api的好

谢谢 大帅老猿 老师做的动图,Composition Api VS Option Api 的优缺点十分明了展示在了动画上!

Option Api代码量少还好,代码量多容易导致高耦合!

说明:上面是Vue2 Option Api的写法,一个组件下含有data 、methos、computed、watch,同一个功能需要分开写在这些函数上,如果代码量少,那看起来似乎十分明了清晰。一旦代码量大功能复杂,各个功能分开写,维护的时候data 、methos、computed、watch都需要来回切,反而显得过于分散,又高度耦合。

Composition Api解耦Vue2 Option Api实现低耦合高内聚

说明:如果是Composition Api在功能复杂、代码量巨大的组件下,我们配合自定义Hook,将代码按功能分块写,变量和方法在一起定义和调用,比如A功能下集成了响应式变量和方法,我们后期维护只需要改动A功能模块下的代码,不会像Vue2在Option Api需要同时关注逻辑分散的methos和data。

所以自定义Hook的写Vue3必须掌握的!它无不体现Vue3 Composition Api 低耦合高内聚的思想! 笔者在看了官方文档和开源的admin模板都是大量使用自定义Hooks的!

定义一下Vue3的自定义Hook:

虽然官方没有明确指明或定义什么是自定义Hooks,但是却无处不在用;

以函数形式抽离一些可复用的方法像钩子一样挂着,随时可以引入和调用,实现高内聚低耦合的目标;

  • 将可复用功能抽离为外部JS文件
  • 函数名/文件名以use开头,形如:useXX
  • 引用时将响应式变量或者方法显式解构暴露出来如:const {nameRef,Fn} = useXX()
  • (在setup函数解构出自定义hooks的变量和方法)

实例:

简单的加减法计算,将加法和减法抽离为2个自定义Hooks,并且相互传递响应式数据

  • 加法功能-Hook
import { ref, watch } from 'vue';
const useAdd= ({ num1, num2 })  =>{
    const addNum = ref(0)
    watch([num1, num2], ([num1, num2]) => {
        addFn(num1, num2)
    })
    const addFn = (num1, num2) => {
        addNum.value = num1 + num2
    }
    return {
        addNum,
        addFn
    }
}
export default useAdd
  • 减法功能-Hook
//减法功能-Hook
import { ref, watch } from 'vue';
export function useSub  ({ num1, num2 }){
    const subNum = ref(0)
    watch([num1, num2], ([num1, num2]) => {
        subFn(num1, num2)
    })
    const subFn = (num1, num2) => {
        subNum.value = num1 - num2
    }
    return {
        subNum,
        subFn
    }
}
  • 加减法计算组件
<template>
    <div>
        num1:<input v-model.number="num1" style="width:100px" />
        <br />
        num2:<input v-model.number="num2" style="width:100px" />
    </div>
    <span>加法等于:{{ addNum }}</span>
    <br />
    <span>减法等于:{{ subNum }}</span>
</template>
​
<script setup>
import { ref } from 'vue'
import useAdd from './useAdd.js'     //引入自动hook 
import { useSub } from './useSub.js' //引入自动hook 
​
const num1 = ref(2)
const num2 = ref(1)
//加法功能-自定义Hook(将响应式变量或者方法形式暴露出来)
const { addNum, addFn } = useAdd({ num1, num2 })
addFn(num1.value, num2.value)
//减法功能-自定义Hook (将响应式变量或者方法形式暴露出来)
const { subNum, subFn } = useSub({ num1, num2 })
subFn(num1.value, num2.value)
</script>
​

Vue3自定义Hooks和Vue2时代Mixin关系:

Mixin不足

在 Vue 2 中,mixin 是将部分组件逻辑抽象成可重用块的主要工具。但是,他们有几个问题:

1、Mixin 很容易发生冲突:因为每个 mixin 的 property 都被合并到同一个组件中,所以为了避免 property 名冲突,你仍然需要了解其他每个特性。

2、可重用性是有限的:我们不能向 mixin 传递任何参数来改变它的逻辑,这降低了它们在抽象逻辑方面的灵活性。

上面这段是Vue3官方文档的内容,可以概括和补充为:

1、Mixin难以追溯的方法与属性

Vue3自定义Hooks却可以

Vue3自定义Hooks, 引用时将响应式变量或者方法显式暴露出来如:

const {nameRef,Fn} = useXX()

Mixins

export default {
  mixins: [ a, b, c, d, e, f, g ], //一个组件内可以混入各种功能的Mixin
  mounted() {
    console.log(this.name)  //问题来了,这个name是来自于哪个mixin?
  }
}

Mixin不明的混淆,我们根本无法获知属性来自于哪个Mixin文件,给后期维护带来困难

Vue3自定义Hooks

//加法功能-自定义Hook(将响应式变量或者方法形式暴露出来)
const { addNum, addFn } = useAdd({ num1, num2 })
addFn(num1.value, num2.value)
//减法功能-自定义Hook (将响应式变量或者方法形式暴露出来)
const { subNum, subFn } = useSub({ num1, num2 })
subFn(num1.value, num2.value)

我们很容易看出每个Hooks显式暴露出来的响应式变量和方法

2、无法向Mixin传递参数来改变逻辑

但是Vue3自定义Hooks却可以:

Vue3自定义Hooks可以灵活传递任何参数来改变它的逻辑,参数不限于其他hook的暴露出来的变量

Mixins

export default {
  mixins: [ addMixin, subMixin], //组件内混入加法和减法Mixin
  mounted(){
      this.add(num1,num2) //调用addMixin内部的add方法
      this.sub(num1,num2) //调用subMixin内部的sub方法
  }  
}

可以通过调用Mixin内部方法来传递参数,却无法直接给Mixin传递参数,因为Mixin不是函数形式暴露的,不发传参

Vue3自定义Hook

在上面实例基础上添加个算平均的Hook

//平均功能-Hook
import { ref, watch } from "vue";
export function useAverage(addNum) {
  const averageNum = ref(0);
  watch(addNum, (addNum) => {
    averageFn(addNum);
  });
  const averageFn = (addNum) => {
    averageNum.value = addNum / 2;
  };
  return {
    averageNum,
    averageFn,
  };
}

组件内

//组件内
//加法功能-自定义Hook(将响应式变量或者方法形式暴露出来)
const { addNum, addFn } = useAdd({ num1, num2 })
addFn(num1.value, num2.value)//主动调用,返回最新addNum
//平均功能-自定义Hook- hook传入参数值来其他hook暴露出来的变量
const { averageNum, averageFn} = useAverage(addNum)
averageFn(addNum.value)

Vue3自定义Hooks可以灵活传递任何参数来改变它的逻辑,参数不限于其他hook的暴露出来的变量,这提高了Vue3在抽象逻辑方面的灵活性。

3、Mixin同名变量会被覆盖

Vue3自定义Hook可以在引入的时候对同名变量重命名

Mixins

export default {
  mixins: [ addMixin, subMixin], //组件内混入加法和减法Mixin
  mounted(){
      this.add(num1,num2) //调用加法addMixin内部的add方法
      this.sub(num1,num2) //调用减法subMixin内部的sub方法
  }  
}

如果this.add(num1,num2)和 this.sub(num1,num2) 计算的结果返回的同名变量totalNum,由于JS单线程,后面引入的会覆盖前面的,totalNum最终是减法sub的值

Vue3自定义Hooks

//加法功能-自定义Hook(将响应式变量或者方法形式暴露出来)
const { totalNum:addNum, addFn } = useAdd({ num1, num2 })
addFn(num1.value, num2.value)
//减法功能-自定义Hook (将响应式变量或者方法形式暴露出来)
const { totalNum:subNum, subFn } = useSub({ num1, num2 })
subFn(num1.value, num2.value)

在Vue3自定义Hooks中,虽然加法和减法Hooks都返回了totalNum,但是利用es6对象解构很轻松给变量重命名

总结

Vue2时代Option Api ,data、methos、watch.....分开写,这种是碎片化的分散的,代码一多就容易高耦合,维护时来回切换代码是繁琐的!

Vue3时代Composition Api,通过利用各种Hooks和自定义Hooks将碎片化的响应式变量和方法按功能分块写,实现高内聚低耦合

形象的讲法:Vue3自定义Hooks是组件下的函数作用域的,而Vue2时代的Mixins是组件下的全局作用域。全局作用域有时候是不可控的,就像var和let这些变量声明关键字一样,const和let是var的修正。Composition Api正是对Vue2时代Option Api 高耦合和随处可见this的黑盒的修正,Vue3自定义Hooks是一种进步。

把Mixin和自定义Hook进行比较,一个是Option Api的体现,一个是Composition Api的体现。如果能理解高内聚低耦合的思想,那么就能理解为什么Vue3是使用Composition Api,并通过各种自定义Hooks使代码更强壮。像写诗一样写代码。而不是写屎。

以上就是Vue3编程流畅技巧自定义Hooks的详细内容,更多关于Vue3编程自定义Hooks的资料请关注编程网其它相关文章!

--结束END--

本文标题: Vue3编程流畅技巧自定义Hooks

本文链接: https://www.lsjlt.com/news/153220.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue3编程流畅技巧自定义Hooks
    目录Vue3自定义Hooks让写Vue3更畅快Vue3自定义Hooks定义:为什么Vue3要用自定义Hook?:写Vue3请摆脱Vue2无脑this的思想:几张动图复习Composi...
    99+
    2024-04-02
  • Vue3中怎么自定义Hooks
    本文小编为大家详细介绍“Vue3中怎么自定义Hooks”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue3中怎么自定义Hooks”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Composition Api解耦...
    99+
    2023-07-02
  • Vue3编程流畅技巧使用setup语法糖拒绝写return
    目录Vue3.2 setup语法糖1.<script setup>在<template/>使用2、<script setup>引入组件将自动注册3...
    99+
    2024-04-02
  • vue3自定义hooks/可组合函数方式
    目录自定义hooks/可组合函数1.mixins方式的痛点2.传统mixins方式示例3.自定义hooks方式示例vue3(hooks)自定义hooks/可组合函数 vue3 com...
    99+
    2024-04-02
  • vue3封装自定义v-model的hooks示例详解
    目录前言基础基本的v-model多个v-model绑定v-model修饰符进阶问题背景方式一:通过watch中转方式二:computed的get和set终极:封装v-model的ho...
    99+
    2024-04-02
  • vue3的setup语法如何自定义v-model为公用hooks
    目录前言基础基本的v-model多个v-model绑定v-model修饰符进阶问题背景方式一:通过watch中转方式二:computed的get和set终极:封装v-model的ho...
    99+
    2024-04-02
  • vue3使用自定义hooks获取dom元素的问题说明
    目录使用自定义hooks获取dom元素问题分享下楼主自己的观点vue获取/操作组件的dom元素下面是我的代码内容(非全部内容)最后总结使用自定义hooks获取dom元素问题 在自定义...
    99+
    2024-04-02
  • vue3在自定义hooks中使用useRouter报错的解决方案
    目录自定义hooks中使用useRouter报错useRouteruseRoute使用Vue.use()报错“Cannot read property ‘us...
    99+
    2022-11-13
    vue3 useRouter报错 vue3自定义hooks 使用useRouter报错
  • Python 编程技巧:如何在二维码中嵌入自定义图像?
    二维码是一种常用的二进制编码方式,可以将信息转换为黑白方块图案,以便通过扫描二维码来获取信息。在实际应用中,我们经常需要将二维码与自定义图像相结合,以增加二维码的美观度和可识别度。本文将介绍如何使用 Python 的 qrcode 库和 ...
    99+
    2023-08-27
    二维码 bash npm
  • Vue3怎么编写自定义指令插件
    今天小编给大家分享一下Vue3怎么编写自定义指令插件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。编写自定义插件//&nbs...
    99+
    2023-07-02
  • JavaScript自定义Promise实现流程
    目录1. 初始结构2. 定义状态3. this指向4. then 方法5. 执行异常6. 支持异步(重头戏1)7. 回调保存(重头戏2)8. 重难点解读9. 链式功能(重头戏3)1....
    99+
    2022-11-13
    JavaScript Promise JavaScript Promise原理 JS Promise
  • activity的自定义流程是什么
    自定义流程是指根据特定需求,用户可以自行定义和配置的活动流程。以下是一般的自定义流程的步骤:1. 确定目标:确定活动的目标和预期结果...
    99+
    2023-09-16
    activity
  • android自定义view流程是什么
    Android自定义View的流程如下:1. 创建一个继承自View的子类,命名为CustomView。2. 在CustomView...
    99+
    2023-09-12
    android
  • springboot自定义配置及自定义对象映射的全流程
    目录一、使用@Value注解获取(一个一个获取)1.1 使用方法1.2 举例说明二、自定义对象映射2.1 使用方法2.2 举例说明一、使用@Value注解获取(一个一个获取)1.1 ...
    99+
    2024-04-02
  • Vue3编写自定义指令插件的示例代码
    编写自定义插件 // src/plugins/directive.ts import type { App } from 'vue' // 插件选项的类型 interface Opt...
    99+
    2024-04-02
  • Pandas自定义shift与DataFrame求差集的小技巧
    目录Pandas的高级shift偏移Datafream对象求差集总结 大家好,我是小小明。今天分享两个小技巧: Pandas的高级shift偏移 有很多玩量化的朋友经常碰到...
    99+
    2024-04-02
  • SpringBoot自定义Starter实现流程详解
    目录starter起步依赖starter命名规则自定义starternew module添加依赖simplebean自动配置类META-INF\spring.factories在sp...
    99+
    2024-04-02
  • 自定义golang函数实现的性能优化技巧
    编写和优化自定义 golang 函数的技巧对于提升应用程序性能至关重要:缓存函数结果以避免重复计算。使用并发并行执行昂贵的操作。使用指针避免大结构和切片的复制开销。优化循环避免不必要的变...
    99+
    2024-04-26
    golang 关键词提取
  • iOS开发自定义页脚和页眉技巧详解
    目录前言I 自定义页脚和页眉1.1 自定义分组页眉的步骤1.2 实现UITableViewHeaderFooterView1.3 其他案例II titleForHeaderInSec...
    99+
    2024-04-02
  • Java自定义范型的应用技巧有哪些呢
    这篇文章将为大家详细讲解有关Java自定义范型的应用技巧有哪些呢,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。我们在JAVA中处处都用到了范型,JAVA中的范型是从C++模板继承来的,不过J...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作