vue3 自定义Hooks


文章目录

  • 前言
  • 一、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

vue3 自定义Hooks_第1张图片

使用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的使用与案例。

你可能感兴趣的:(vue学习,vue.js,前端,javascript)