vue3必学技能–自定义Hooks让vue3更加畅快
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请摆脱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。。。。。
大胆定义一下Vue3的自定义Hook:
虽然官方没有明确指明或定义什么是自定义Hooks,但是却无处不在用;
以函数形式抽离一些可复用的方法像钩子一样挂着,随时可以引入和调用,实现高内聚低耦合的目标;
1/将可复用功能抽离为外部JS文件
2/函数名/文件名以use开头,形如:useXX
3/引用时将响应式变量或者方法显式解构暴露出来如:const {nameRef,Fn} = useXX()
(在setup函数解构出自定义hooks的变量和方法)
来一个简单的自定义Hook:
1、
import {ref,watch} from "vue"
const useAdd = ({num1,num2})=>{
const addNum = ref(0);
watch([num1,num2],(num1,num2)=>{
addFunc(num1,num2)
})
const addFunc = (num1,num2)=>{
= num1+num2
}
return {
addNum,
addFunc
}
}
export default useAdd
2、
import {ref,watch} from "vue"
export function useCut({num1,num2}){
const cutNum = ref(0);
watch([num1,num2],(num1,num2)=>{
cutFunc(num1,num2)
})
const cutFunc = (num1,num2)=>{
= num1+num2
}
return {
cutNum,
cutFunc
}
}
使用hooks
<template>
<div>
num1:<input ="num1" style="width:100px" />
<br />
num2:<input ="num2" style="width:100px" />
</div>
<span>加法等于:{{ addNum }}</span>
<br />
<span>减法等于:{{ cutNum }}</span>
</template>
import { ref } from 'vue'
import useAdd from './' //引入自动hook
import { useCut } from './' //引入自动hook
const num1 = ref(2)
const num2 = ref(1)
//加法功能-自定义Hook(将响应式变量或者方法形式暴露出来)
const { addNum, addFunc } = useAdd({ num1, num2 })
addFn(, )
//减法功能-自定义Hook (将响应式变量或者方法形式暴露出来)
const { cutNum, cutFunc } = useCut({ num1, num2 })
subFn(, )
总结:
1、Vue2时代Option Api ,data、methos、watch…分开写,这种是碎片化的分散的,代码一多就容易高耦合,维护时来回切换代码是繁琐的!
2、Vue3时代Composition Api,通过利用各种Hooks和自定义Hooks将碎片化的响应式变量和方法按功能分块写,实现高内聚低耦合
3形象的讲法:Vue3自定义Hooks是组件下的函数作用域的,而Vue2时代的Mixins是组件下的全局作用域。全局作用域有时候是不可控的,就像var和let这些变量声明关键字一样,const和let是var的修正。Composition Api正是对Vue2时代Option Api 高耦合和随处可见this的黑盒的修正,Vue3自定义Hooks是一种进步。
4、把Mixin和自定义Hook进行比较,一个是Option Api的体现,一个是Composition Api的体现。如果能理解高内聚低耦合的思想,那么就能理解为什么Vue3是使用Composition Api,并通过各种自定义Hooks使代码更强壮。像写诗一样写代码。而不是写屎。
原文链接地址:/post/7083401842733875208