文章目录
- 前言
- 一、Hooks是什么?
- 二、图片转换Base64
- 1.Hooks
- 2.使用
- 三、监听元素宽高(自定义指令+Hooks)
- 1.Hooks
- 2.使用
- 总结
前言
本文主要记录了vue3学习中自定义Hooks和vue2中Mixins的使用与案例。
一、Hooks是什么?
Hooks用来处理复用代码逻辑的一些封装,Hooks与Mixins不同点在于Hooks是函数。
在vue2中是以Mixins形式将相同的逻辑抽离,各个组件只需要引入mixins,就能使用,mixins存在覆盖问题:
组件data、methods、filters会覆盖mixins中同名data、methods、filters
使用VueUse库可以使用100多项用Hooks完成的功能
二、图片转换Base64
1.Hooks
代码如下:
type Options = {
el:string
}
export default function (options:Options):Promise<{baseUrl:string}> {
// @ts-ignore
return new Promise((resolve)=>{
onMounted(()=>{
let img:HTMLImageElement = document.querySelector(options.el) as HTMLImageElement
img.onload = () =>{
resolve({
baseUrl:base64(img)
})
}
})
const base64 = (el:HTMLImageElement) =>{
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
canvas.width = el.width
canvas.height = el.height
ctx?.drawImage(el,0,0,canvas.width,canvas.height)
return canvas.toDataURL('image/jpg')
}
})
}
2.使用
代码如下:
import useBase64 from '../../../../hooks/index'
useBase64({
el: '#img'
}).then(res=>{
console.log(res.baseUrl)
})
三、监听元素宽高(自定义指令+Hooks)
1.Hooks
这里要注意的是vue插件需要定义install方法,在app.use()挂载时会调用该方法
/**
* interSectionObserver 主要监听元素是否在视口内
* MutationObserver 主要监听子集的变化 以及 元素的增删改查
* ResizeObserver 主要监听元素宽高的变化
*/
// @ts-ignore
import type { APP } from 'vue'
/**
* 自定义Hooks监听元素宽高变化
* @param el
* @param callback
*/
function useResize(el:HTMLElement,callback:Function) {
let resize = new ResizeObserver((entries)=>{
callback(entries[0].contentRect)
})
resize.observe(el)
}
/**
* 自定义指令
* vue插件 必须要有install方法,在app.use()时会调用该方法
* @param app
*/
const install = (app:APP) => {
app.directive('resize', {
mounted(el,binding) {
useResize(el,binding.value)
}
})
}
// 将install 挂载到useResize上的install上
useResize.install = install
export default useResize
2.使用
<script setup lang="ts">
import {onMounted} from "vue";
import useResize from "../../../hooks/useResize";
// 自定义Hooks
onMounted(()=>{
useResize(document.querySelector('.box') as HTMLElement,(e:any)=>{
console.log('自定义Hooks',e)
})
})
// 自定义指令
const aaa = (e)=>{
console.log('自定义指令',e)
}
</script>
<template>
<div v-resize="aaa" class="box"></div>
</template>
<style scoped>
.box{
overflow: hidden;
border: 2px solid black;
resize: both;
width: 300px;
height: 300px;
}
</style>
总结
本文主要记录了vue3学习中自定义Hooks和vue2中Mixins的使用与案例。