gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

聊聊Vue3+qrcodejs如何生成二維碼并添加文字描述

Vue3如何更好地使用qrcodejs生成二維碼并添加文字描述?下面本篇文章給大家介紹一下Vue3+qrcodejs生成二維碼并添加文字描述,希望對大家有所幫助。

聊聊Vue3+qrcodejs如何生成二維碼并添加文字描述

最近項目中有生成二維碼功能的需求,還需要在二維碼底部添加文字描述,并把二維碼和文字合并成一張圖下載的要求。

之前的項目有用到vue-qr,確實非常好用,但是考慮到添加文字描述,后面就選擇了qrcodejs。(學習視頻分享:vue視頻教程)

文章項目基于 《使用Vite搭建Vue3項目實踐記錄 》

https://juejin.cn/post/7082307153192550430

生成二維碼

安裝qrcodejs,并安裝其類型定義模塊

npm i qrcode -S npm install --save @types/qrcode

新建全局二維碼組件QRcode.vue,二維碼信息及文字描述都由外部傳入

基本操作就是先調用qrcodetoDataURL方法,獲取到二維碼的Base64圖片信息,隨后新建Image,再把圖片畫到Canvas

最后加上自定義文字即可

需要注意的是文字的位置是在圖片底部居中

qrCodeOptionqrcode相關配置,詳情qrcode – npm (npmjs.com)

<template>   <canvas id="canvas" ref="canvas" :width="width" :height="height"></canvas> </template>  <script setup> import QRCode from "qrcode"; import { onMounted, ref } from "vue";  const props = defineProps({   //二維碼存儲內容   qrUrl: {     type: String,     default: "Hello World"   },   // canvas width   width: {     type: Number,     default: 400   },   // canvas height   height: {     type: Number,     default: 400   },   // 二維碼尺寸(正方形 長寬相同)   qrSize: {     type: Number,     default: 360   },   // 二維碼底部文字   qrText: {     type: String,     default: "Hello World"   },   //底部說明文字字號   qrTextSize: {     type: Number,     default: 24   } });  const qrCodeOption = {   errorCorrectionLevel: "H",   width: props.qrSize,   version: 7 };  const canvas = ref<HTMLCanvasElement>(); /**  * @argument qrUrl        二維碼內容  * @argument qrSize       二維碼大小  * @argument qrText       二維碼中間顯示文字  * @argument qrTextSize   二維碼中間顯示文字大小(默認16px)  */ const handleQrcode = () => {   let dom = canvas.value as HTMLCanvasElement;   QRCode.toDataURL(props.qrUrl, qrCodeOption)     .then((url: string) => {       // 畫二維碼里的logo// 在canvas里進行拼接       const ctx = dom.getContext("2d") as CanvasRenderingContext2D;       const image = new Image();       image.src = url;       setTimeout(() => {         ctx.drawImage(image, (props.width - props.qrSize) / 2, 0, props.qrSize, props.qrSize);         if (props.qrText) {           //設置字體           ctx.font = "bold " + props.qrTextSize + "px Arial";           let tw = ctx.measureText(props.qrText).width; // 文字真實寬度           let ftop = props.qrSize - props.qrTextSize; // 根據字體大小計算文字top           let fleft = (props.width - tw) / 2; // 根據字體大小計算文字left           ctx.fillStyle = "#fff";           ctx.textBaseline = "top"; //設置繪制文本時的文本基線。           ctx.fillStyle = "#333";           ctx.fillText(props.qrText, fleft, ftop);         }       }, 0);     })     .catch((err: Error) => {       console.error(err);     }); };  onMounted(() => {   handleQrcode(); }); </script>  <style scoped></style>

思考和優化setTimeout改為Promise

到這里二維碼的功能基本可以使用了,但是我在想為什么這里需要使用到setTimeout呢?

如果是nextTick行不行?答案是不行的,原因是nextTick是微任務,實在DOM刷新之前就執行了,而setTimeout在之后執行。

可以注意到代碼中有新建Image方法,圖片加載是異步的,所以有更好的處理方法嗎?

可以改用Promise,在圖片的onload方法中返回圖片就可以了,所以改寫下handleQrcode

const handleQrcode = () => {   let dom = canvas.value as HTMLCanvasElement;   QRCode.toDataURL(props.qrUrl, qrCodeOption)     .then((url: string) => {       // 畫二維碼里的logo// 在canvas里進行拼接       const ctx = dom.getContext("2d") as CanvasRenderingContext2D;       const image = new Image();       image.src = url;       new Promise<HTMLImageElement>((resolve) => {         image.onload = () => {           resolve(image);         };       }).then((img: HTMLImageElement) => {         // console.log(img, ctx)         ctx.drawImage(img, (props.width - props.qrSize) / 2, 0, props.qrSize, props.qrSize);         if (props.qrText) {           //設置字體           ctx.font = "bold " + props.qrTextSize + "px Arial";           let tw = ctx.measureText(props.qrText).width; // 文字真實寬度           let ftop = props.qrSize - props.qrTextSize; // 根據字體大小計算文字top           let fleft = (props.width - tw) / 2; // 根據字體大小計算文字left           ctx.fillStyle = "#fff";           ctx.textBaseline = "top"; //設置繪制文本時的文本基線。           ctx.fillStyle = "#333";           ctx.fillText(props.qrText, fleft, ftop);         }       });     })     .catch((err: Error) => {       console.error(err);     }); };

二維碼下載

有了二維碼就需要下載,補充下載方法,在組件內部加

直接使用canvas toDataURL方法轉成Base64

//保存圖片 const savePic = () => {   let dom = canvas.value as HTMLCanvasElement;   let a = document.createElement("a");   //將二維碼面板處理為圖片   a.href = dom.toDataURL("image/png", 0.5);   a.download = props.qrUrl + ".png";   a.click(); };  defineExpose({ savePic });

父組件調用

全局注冊

可以把組件注冊為全局組件,可以參考文章Vue項目中的實用技巧記錄

其中包括webpackvite遍歷vue文件注冊全局組件

調用組件

<template>   <div class="container">     <QRcode />   </div> </template>

效果如圖

聊聊Vue3+qrcodejs如何生成二維碼并添加文字描述

多二維碼遍歷下載

上面補充的下載方法中,需要使用defineExpose,不然會調用不到子組件方法

<template>   <div>     <QRcode v-for="item in qrcodeList" ref="qrcode" :key="item.id" :qr-url="item.label" :qr-text="item.label" />     <el-button @click="downloadAll">downlaod</el-button>   </div> </template>  <script setup> import { reactive, ref } from "vue"; const qrcode = ref(); const qrcodeList = reactive([   { id: 1, label: "山卡拉OK" },   { id: 2, label: "伍六七" },   { id: 3, label: "梅小姐" },   { id: 4, label: "雞大保" },   { id: 5, label: "小飛雞" } ]);  const downloadAll = () => {   qrcode.value.map((item: any) => {     item.savePic();   }); }; </script>

Option Api案例

Option Api的案例如下

src/components/QRcodeOption.vue · LWH/vite-vue3-project – 碼云 – 開源中國 (gitee.com)

src/views/qrcode/qrcode2.vue · LWH/vite-vue3-project – 碼云 – 開源中國 (gitee.com)

(學習視頻分享:web前端開發、編程基礎視頻)

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
中文字幕天天干| 国产美女主播在线播放| 日韩在线综合网| 免费不卡av在线| www.一区二区.com| www国产免费| 一本—道久久a久久精品蜜桃| 国产av人人夜夜澡人人爽| 国产原创popny丨九色| www在线观看免费| 黄色一级在线视频| 国产美女三级视频| 天天天干夜夜夜操| 天天干天天操天天玩| 国产欧美一区二| 亚洲天堂一区二区在线观看| 亚洲免费视频播放| 女同性恋一区二区| 成人免费播放器| 天堂av在线网站| 污视频网址在线观看| 三级网在线观看| 精品成在人线av无码免费看| 黄色一级视频在线播放| 亚洲精品高清无码视频| 亚洲精品手机在线观看| 2021国产视频| 成人小视频在线看| 日本精品一区在线| 久草视频国产在线| 中文字幕亚洲乱码| 老子影院午夜伦不卡大全| 91成人在线观看喷潮教学| 一道本视频在线观看| 国产乱女淫av麻豆国产| 日韩小视频在线播放| 精品一卡二卡三卡| jizzzz日本| 亚洲理论电影在线观看| 欧美 日韩精品| 美国av在线播放| 能在线观看的av| 色综合天天色综合| 97在线国产视频| 婷婷中文字幕在线观看| 国产资源在线视频| 日韩精品一区二区三区电影| av免费在线播放网站| 中国女人做爰视频| 亚洲天堂网一区| 国产精品无码人妻一区二区在线| 青娱乐精品在线| 国产一二三四在线视频| 国产精品国产亚洲精品看不卡| 色91精品久久久久久久久| 每日在线更新av| 日本中文字幕在线视频观看| 中文字幕一区二区三区四| 十八禁视频网站在线观看| 欧美这里只有精品| 亚洲色图都市激情| 久久视频免费在线| 自拍一级黄色片| 午夜av中文字幕| 欧美性视频在线播放| 三级一区二区三区| 伊人影院综合在线| 爱情岛论坛亚洲首页入口章节| 成年人视频网站免费观看| 伊人成色综合网| 日韩中文字幕在线视频观看 | 国产女女做受ⅹxx高潮| 国产日韩欧美精品在线观看| 精品国产一区二区三区在线| 日韩人妻精品一区二区三区| 国产日韩欧美大片| av影院在线播放| 亚洲 欧美 综合 另类 中字| 国内少妇毛片视频| 国产青青在线视频| 少妇性l交大片| 日本 片 成人 在线| 91视频这里只有精品| 超碰91在线播放| 国产又粗又硬又长| 六月婷婷在线视频| 免费看国产曰批40分钟| 浮妇高潮喷白浆视频| 美女福利视频在线| 国产免费中文字幕| 干日本少妇视频| 国产成人亚洲综合无码| 特级毛片在线免费观看| 国产乱子伦精品无码专区| 男人操女人逼免费视频| 蜜臀久久99精品久久久酒店新书 | aaa毛片在线观看| 亚洲一区二区福利视频| 国产成人一区二区三区别| 欧美黑人经典片免费观看| 无码精品国产一区二区三区免费| 欧美精品久久久久久久久25p| 亚洲美女性囗交| 国产精品国三级国产av| 白嫩少妇丰满一区二区| 午夜视频在线网站| 国产a级片网站| www.国产区| 天堂在线一区二区三区| 成人黄色av片| 免费成人进口网站| 亚欧在线免费观看| 国产精品国产对白熟妇| 日韩va在线观看| 欧美日韩在线视频一区二区三区| 三级a三级三级三级a十八发禁止| 国产高清不卡无码视频| 欧美在线aaa| 色婷婷综合久久久久中文字幕| 婷婷激情小说网| 亚洲三级视频网站| 国产成人a亚洲精v品无码| 免费观看中文字幕| 992tv人人草| 中文字幕66页| 国产又黄又猛又粗又爽的视频| 成人免费播放器| 国产91沈先生在线播放| 91制片厂免费观看| 一级做a爱视频| 在线观看国产福利| 亚欧激情乱码久久久久久久久| 国产白丝袜美女久久久久| 日韩小视频网站| 人妻互换免费中文字幕| 黄色a级在线观看| 国产91av视频在线观看| 99九九精品视频| 在线无限看免费粉色视频| 两性午夜免费视频| 国产成人三级视频| 久久这里只有精品23| 精品国偷自产一区二区三区| 青春草在线视频免费观看| 精品国产乱码久久久久久1区二区| 色戒在线免费观看| 国产日韩视频在线播放| 黄黄视频在线观看| 国产极品尤物在线| 免费日韩视频在线观看| 搡女人真爽免费午夜网站| 一级黄色特级片| 国产又大又长又粗又黄| 黄色网络在线观看| 国产乱淫av片杨贵妃| 欧美在线观看视频网站| wwwwww欧美| 污污的视频免费| 美女扒开大腿让男人桶| 亚洲熟妇av日韩熟妇在线| 黄色小视频免费网站| 日本熟妇人妻中出| 91极品视频在线观看| 免费看av软件| 国产精品国三级国产av| 一区二区三区国产免费| 天天爱天天做天天操| 人人干视频在线| 亚洲一二三区av| 亚洲天堂第一区| 免费高清在线观看免费| 欧美h视频在线观看| 国产真实乱子伦| 91精品一区二区三区四区| av免费网站观看| 免费网站永久免费观看| 日本三级黄色网址| 中文字幕日本最新乱码视频| 色天使在线观看| 国产免费黄视频| 国产成人生活片| 亚洲一区二区偷拍| 成人午夜视频免费在线观看| www.99riav| 五月天国产视频| 亚州精品一二三区| 国产午夜大地久久| 日本大胆人体视频| www.51色.com| 91最新在线观看| 日韩毛片在线免费看| 国产一线二线三线女| 老司机午夜免费福利视频| 中文字幕av不卡在线| 欧美亚洲日本在线观看| 欧美视频在线播放一区| 日韩av高清在线看片| 91网站在线观看免费| 伊人色在线视频| 天天影视色综合|