自定义hooks

87 阅读1分钟

vue2中的mixins有两个问题,一个是后续查找变量可能找了半天发现是定义在mixins里面,另外i同一个是由于mixins的生命周期在其组件之前,若组件定义的变量相同会重置变量的值

vue3的hooks就没有这两个问题,因为是暴露一个函数

下面的demo是将其图片的url转换为base64,将dom节点传入函数,通过canvas去将其转换为base64,返回的promise

import { onMounted } from "vue"

type Options = {
    el: string
}

export default function (options: Options):Promise<{base64Url:string}> {
    return new Promise((resolve) => {
        onMounted(() => {
            let img: HTMLImageElement = document.querySelector(options.el) as HTMLImageElement
            console.log('img', img)
            img.onload = () => {
                resolve({
                    base64Url: base64(img)
                })
            }
        })
        const base64 = (el: HTMLImageElement) => {
            const canvas = document.createElement('canvas')
            const ctx = canvas.getContext('2d')
            canvas.width = el.width
            canvas.height = el.height
            //设置canvas的生成参数
            ctx?.drawImage(el, 0, 0, canvas.width, canvas.height)
            //toDataURL转为base64
            return canvas.toDataURL('image/png')
        }

    })
}

组件的使用

<template>
  <div>
    <img class="img" id="img" src="@/assets/logo.svg" alt="">
  </div>
</template>

<script lang="ts" setup>
import { reactive, ref } from 'vue'
import base64Url from './index'
 base64Url({el:'#img'}).then(res=>{
    console.log('res.base64Url', res.base64Url)
 })
</script>
<style lang='scss' scoped>
.img{
    width: 100px;
    height: 100px;
}
</style>