vue3 自定义Hooks

news2024/11/29 4:49:32

文章目录

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

Mixins生命周期

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html给下拉框添加搜索、分页功能(通过ajax从服务器获取搜索数据)

文章目录 下拉框搜索分页功能开发功能使用源码和Demo&#xff08;点个赞再走咯&#xff09;test.htmlsearchable-select.csssearchserver-select.js 下拉框搜索分页功能开发 最近需要开发一个下拉框从服务器通过Ajax请求搜索数据库并且分页的组件&#xff0c;源码和demo放在下面…

【微信小程序开发】宠物预约医疗项目实战-开发功能介绍

【微信小程序开发】宠物医院项目实战-开发功能介绍 前言 本项目主要带领大家学习微信小程序开发技术&#xff0c;通过一个完整的项目系统的学习微信小程序的开发过程。鉴于一些同学对视频教学跟不上节奏&#xff0c;为此通过图文描述的方式&#xff0c;完整的将系统开发过程记…

【Redis】Redis常见面试题

【Redis】Redis常见面试题&#xff08;3&#xff09; 文章目录 【Redis】Redis常见面试题&#xff08;3&#xff09;1. 特性&应用场景1.1 Redis能实现什么功能1.2 Redis支持分布式的原理1.3 为什么Redis这么快1.4 Redis实现分布式锁1.5 Redis作为缓存 2. 数据类型2.1 Redis…

C# 委托学习1

委托的标准定义是&#xff0c;委托是一种引用类型&#xff0c;表示对具有特定参数列表和返回类型的方法的引用&#xff1b; 在实例化委托时&#xff0c;你可以将其实例与任何具有兼容签名和返回类型的方法相关联&#xff1b; 还有一种定义看上去也是正确的&#xff1a;委托是…

ModuleNotFoundError: No module named ‘gevent‘

1、先确定pip版本&#xff1a; pip3 list: 看到没有gevent包 如果pip版本不是最新版可以使用命令python -m pip install --upgrade pip进行更新&#xff0c; 2、安装 pip3 install gevent 安装完成

联合国教科文发布,ChatGPT等生成式AI教育应用指南

联合国教科文组织&#xff08;UNESCO&#xff09;在官网发布了&#xff0c;全球首个《生成式AI与教育未来》的应用指南。呼吁各国实施适当的政策&#xff0c;以确保在教育中应用以人为本的方法来使用生成式AI。&#xff08;指南下载地址&#xff1a;https://unesdoc.unesco.org…

排序(希尔、快速、归并排序)

文章目录 1.排序的概念及其运用 2.插入排序 3.选择排序 文章内容 1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在…

K8s上安装gitlab-ce

文章目录 K8s上安装gitlab-ce操作如下gitlab-deployment.yml K8s上安装gitlab-ce 前言   使用pv-pvc来持久化gitlab的数据&#xff0c;配置&#xff0c;日志文件。   pod启动后需要需要修改external_url然后重启pod。 操作如下 mkdir -p /mnt/data01/gitlab ctr -n k8s.…

C# Onnx Yolov8 Cls 分类

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…

sql server 触发器的使用

看数据库下的所有触发器及状态 SELECT a.name 数据表名 , sysobjects.name AS 触发器名 , sysobjects.crdate AS 创建时间 , sysobjects.info , sysobjects.status FROM sysobjects LEFT JOIN ( SELECT * FROM sysobjects WHERE xtype U ) AS a ON sysobjects.parent_obj a.…

Git: 工作区、暂存区、本地仓库、远程仓库

参考链接&#xff1a; Git: 工作区、暂存区、本地仓库、远程仓库 https://blog.csdn.net/weixin_36750623/article/details/96189838

阿里云通义千问向全社会开放,近期将开源更大参数规模大模型

9月13日&#xff0c;阿里云宣布通义千问大模型已首批通过备案&#xff0c;并正式向公众开放&#xff0c;广大用户可登录通义千问官网体验&#xff0c;企业用户可以通过阿里云调用通义千问API。 通义千问在技术创新和行业应用上均位居大模型行业前列。IDC最新的AI大模型评估报告…

腾讯云AI超级底座新升级:训练效率提升幅度达到3倍

大模型推动AI进入新纪元&#xff0c;对计算、存储、网络、数据检索及调度容错等方面提出了更高要求。在9月7日举行的2023腾讯全球数字生态大会“AI超级底座专场”上&#xff0c;腾讯云介绍异构计算全新产品矩阵“AI超级底座”及其新能力。 腾讯云副总裁王亚晨在开场致辞中表示&…

创建第一个MyBatis框架--保姆级教学

文章目录 前言一、创建一个空的mybatis项目二、创建一个Maven模块三、各个文件的配置四、总结 前言 在idea上创建我的第一个MyBatis框架 一、创建一个空的mybatis项目 1、new一个新的项目 2、选择最下面&#xff0c;创建一个空项目 3、为空项目取一个名字,位置可以自己选 4、点…

TCP 和 UDP 的 Socket 调用

在网络层&#xff0c;Socket 函数需要指定到底是 IPv4 还是 IPv6&#xff0c;分别对应设置为 AF_INET 和 AF_INET6。另外&#xff0c;还要指定到底是 TCP 还是 UDP。TCP 协议是基于数据流的&#xff0c;所以设置为 SOCK_STREAM&#xff0c;而 UDP 是基于数据报的&#xff0c;因…

java的集合进阶学习

1.集合类 集合类的特点&#xff1a;提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以随时发生改变 2.集合体系结构 3.Collection集合 Collection集合常用方法 Collection集合的遍历 4.List集合特点 LinkedList集合的特有功能 数组和链表数据结构 栈&#xff…

数据分析三剑客之Pandas

1.引入 前面一篇文章我们介绍了numpy&#xff0c;但numpy的特长并不是在于数据处理&#xff0c;而是在它能非常方便地实现科学计算&#xff0c;所以我们日常对数据进行处理时用的numpy情况并不是很多&#xff0c;我们需要处理的数据一般都是带有列标签和index索引的&#xff0…

MCU软核 1. Altera FPGA上运行8051

0. 环境 - Quartus 13 - EP4CE6E22开发板 - keil c51 - ag10kl144h&#xff08;本工程兼容AGM&#xff09; 下载8051源码&#xff1a;https://www.oreganosystems.at/products/ip-cores/8051-ip-core 1. Create Project File --> New Project Wizard 位置&#xff1a;E…

什么是ELK

什么是ELK ELK 并不是一个技术框架的名称&#xff0c;它其实是一个三位一体的技术名词&#xff0c;ELK 的每个字母都来自一个技术组件&#xff0c;分别是 Elasticsearch&#xff08;简称 ES&#xff09;、Logstash 和 Kibana。 三个技术组件是独立的&#xff0c;后两个被elast…

yolov5权重文件.pt转.bin文件

参考链接&#xff1a;YOLOv5学习记录(二): 模型转化及Android端部署_yolo .pt文件转未bin_Xiaoer__Lu的博客-CSDN博客 1、准备pt文件 我的目录是&#xff1a;C:\Users\Administrator\Desktop\driving\yolov5-mask-42-master\runs\train\exp_yolov5s\weights里的best.pt 2、p…