当前位置: 首页 > news >正文

vue 画二维码及长按保存

需求

想要做如下图的二维码带文字,且能够长按保存
在这里插入图片描述

前期准备

  1. 一个canvas
  2. 安装qrcode(命令:npm i qrcode)

画二维码及文字

初始化画布

<template><div><canvas ref="canvas" width="300" height="400"></canvas></div>
</template><script setup>
import { ref, onMounted } from 'vue';
const canvas = ref(null);
onMounted(() => {// 初始化画布let ctx = canvas.value.getContext('2d');
})
</script>

画文字

<template><div><canvas ref="canvas" width="300" height="400"></canvas></div>
</template><script setup>
import { ref, onMounted } from 'vue';
const canvas = ref(null);
onMounted(() => {// 初始化画布let ctx = canvas.value.getContext('2d');// 填充白色ctx.fillStyle = "#fff";ctx.fillRect(0, 0, 300, 400);// 画文字ctx.font = "14px Microsoft YaHei"ctx.textBaseline = "middle";ctx.textAlign = "center";ctx.fillStyle = "#333333";ctx.fillText("简单教程,简单编程", canvas.value.width / 2, 40);
})
</script>

画二维码

二维码需要使用qrcode转换

<template><div><canvas ref="canvas" width="300" height="400"></canvas></div>
</template><script setup>
import QRCode from 'qrcode';
import { ref, onMounted } from 'vue';
const canvas = ref(null);
onMounted(() => {// 初始化画布let ctx = canvas.value.getContext('2d');// 填充白色ctx.fillStyle = "#fff";ctx.fillRect(0, 0, 300, 400);// 画文字ctx.font = "14px Microsoft YaHei"ctx.textBaseline = "middle";ctx.textAlign = "center";ctx.fillStyle = "#333333";ctx.fillText("简单教程,简单编程", canvas.value.width / 2, 40);// 画二维码QRCode.toDataURL('I am a pony!', function (err, url) {let img = new Image()img.src = url;img.onload = function () {ctx.drawImage(img, 50, 50, 200, 200);}})
})
</script>

长按保存

通过监听触摸事件的时间判定长按

<template><div><div class="friend" @touchstart="gtouchstart()" @touchmove="gtouchmove()" @touchend="showDeleteButton()"><canvas ref="canvas" width="300" height="400"></canvas></div></div>
</template><script setup>
import QRCode from 'qrcode';
import { ref, onMounted } from 'vue';
const canvas = ref(null);
onMounted(() => {let ctx = canvas.value.getContext('2d');// 填充白色ctx.fillStyle = "#fff";ctx.fillRect(0, 0, 300, 400);// 画文字ctx.font = "14px Microsoft YaHei"ctx.textBaseline = "middle";ctx.textAlign = "center";ctx.fillStyle = "#333333";ctx.fillText("简单教程,简单编程", canvas.value.width / 2, 40);// 画二维码QRCode.toDataURL('I am a pony!', function (err, url) {let img = new Image()img.src = url;img.onload = function () {ctx.drawImage(img, 50, 50, 200, 200);}})
})
let timeOutEvent = null //定时器 
//长按事件设置定时器
let gtouchstart = () => {timeOutEvent = setTimeout(() => {longPress()}, 700)
}//手释放,如果在200毫秒内就释放,则取消长按事件,此时可以执行onclick应该执行的事件
let showDeleteButton = () => {clearTimeout(timeOutEvent); //清除定时器if (timeOutEvent != 0) {timeOutEvent = 0;}return false;
}
//如果手指有移动,则取消所有事件,此时说明用户只是要移动而不是长按
let gtouchmove = () => {clearTimeout(timeOutEvent); //清除定时器timeOutEvent = 0
}
//真正长按后应该执行的内容
let longPress = () => {timeOutEvent = 0;// 创建一个链接元素const link = document.createElement("a");// 将Canvas转换为数据URLconst dataURL = canvas.value.toDataURL();// 设置链接的href属性为数据URLlink.href = dataURL;// 设置链接的下载属性和文件名link.download = "canvas_image.png";// 模拟点击链接进行下载link.click();
}
</script><style scoped></style>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于TCP的在线词典系统(分阶段实现)(阻塞io和多路io复用(select)实现)
  • 【Linux】 GCC/G++与Makefile使用
  • Android Spinner
  • 数据结构和算法(0-1)----递归
  • ArduPilot开源代码之OpticalFlow_backend
  • arm64架构下源码编译安装kafka —— 筑梦之路
  • 【C++】———— 继承
  • 【Linux网络】IO模型{再识 IO/IO模型/阻塞IO vs 非阻塞IO/同步IO vs 异步IO}
  • LangChain内置函数全解析:深入探索与高效应用
  • iPhone 16 Pro系列将标配潜望镜头:已开始生产,支持5倍变焦
  • druid(德鲁伊)数据线程池连接MySQL数据库
  • 【ElasticSearch】ES 5.6.15 向量插件支持
  • 软件供应链安全:如何防范潜在的攻击?
  • 机器学习筑基篇,Jupyter Notebook 精简指南
  • Docker搭建kafka+zookeeper以及Springboot集成kafka快速入门
  • [数据结构]链表的实现在PHP中
  • 【笔记】你不知道的JS读书笔记——Promise
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CODING 缺陷管理功能正式开始公测
  • CSS 三角实现
  • Electron入门介绍
  • JWT究竟是什么呢?
  • Nacos系列:Nacos的Java SDK使用
  • nfs客户端进程变D,延伸linux的lock
  • PHP面试之三:MySQL数据库
  • php中curl和soap方式请求服务超时问题
  • scala基础语法(二)
  • Vue实战(四)登录/注册页的实现
  • WePY 在小程序性能调优上做出的探究
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 翻译:Hystrix - How To Use
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 工作手记之html2canvas使用概述
  • 工作中总结前端开发流程--vue项目
  • ------- 计算机网络基础
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 译自由幺半群
  • 怎么把视频里的音乐提取出来
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • Android开发者必备:推荐一款助力开发的开源APP
  • hi-nginx-1.3.4编译安装
  • 仓管云——企业云erp功能有哪些?
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​iOS安全加固方法及实现
  • ​ssh免密码登录设置及问题总结
  • #pragma once
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $jQuery 重写Alert样式方法
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (C语言)fgets与fputs函数详解
  • (JS基础)String 类型
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题