日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

如何根據(jù)url 批量下載二維碼實(shí)現(xiàn)詳解

瀏覽:234日期:2022-06-10 10:03:47
目錄
  • React 前端實(shí)現(xiàn)
    • 一、依賴
    • 二、思路整理
      • 1.將選用展示的數(shù)據(jù)放在數(shù)組中
      • 2. 實(shí)用 qrcode + canvas 將 url 裝換成 canvas 的二維碼圖片
      • 3.二維碼 cavans 元素們轉(zhuǎn)成 base64 數(shù)據(jù)保存在 zip 中
      • 4. 正對 React 進(jìn)行封裝
      • 5. 下載完畢
  • 小結(jié)

    React 前端實(shí)現(xiàn)

    有時(shí)候,前端根據(jù) urls 批量下載二維碼的需求。

    例如,在管理系統(tǒng)中,公司里面每一個(gè)人有一個(gè)人主頁(地址), 個(gè)人主頁對應(yīng)自己的內(nèi)容。為了方便這些內(nèi)容對外展示,需要一個(gè)對應(yīng)的二維碼,方便客戶快速的訪問其中內(nèi)容。

    將不同人的主頁地址 url 寫入 二維碼中,然后統(tǒng)一打包到一個(gè) url 中。

    注意在瀏覽中實(shí)現(xiàn),可能會(huì)隨著類容的增多變得慢!

    一、依賴

    • qrcode 生成二維碼
    • jszip 壓縮
    • file-save 保存數(shù)據(jù)到壓縮文件

    二、思路整理

    1.將選用展示的數(shù)據(jù)放在數(shù)組中

    一個(gè)數(shù)據(jù)列表,將選用展示的數(shù)據(jù)放在數(shù)組中,例如,下面一個(gè)簡單的數(shù)據(jù)結(jié)構(gòu)式我們要展示的:

    const list = [
        { name: "qrcode", url: "https://www.npmjs.com/package/qrcode" },
        { name: "article", url: "https://juejin.cn/article" },
        {
          name: "remix-antd-admin",
          url: "https://github.com/yyong008/remix-antd-admin",
        },
      ];

    2. 實(shí)用 qrcode + canvas 將 url 裝換成 canvas 的二維碼圖片

    以下是批量得將 url 掛載到 body 后面:

    const gnVisiableCanvas = async () => {
        for (const item of list) {
          const canvas = document.createElement("canvas");
          canvas.style.display = "none";
          canvas.classList.add("__qrcode");
          canvas.setAttribute("name", item.name);
          await QRCode.toCanvas(canvas, item.url).catch((err) => {
    console.log("qr err", err);
          });
          document.body.appendChild(canvas);
        }
      };

    3.二維碼 cavans 元素們轉(zhuǎn)成 base64 數(shù)據(jù)保存在 zip 中

    將二維碼 cavans 元素們轉(zhuǎn)成 base64 數(shù)據(jù)保存在 zip 中,并保存到文件夾中

    const createQrCodeWithURL = async () => {
        const zip = new JSZip();
        const folder = zip.folder("創(chuàng)建文件夾")!;
        await gnVisiableCanvas();
        const qrs = document.querySelectorAll(".__qrcode");
        qrs.forEach((qr: any) => {
          const data = qr.toDataURL().substring(22); // canvas 轉(zhuǎn)換成 base64
          folder.file(qr.getAttribute("name") + ".png", data, {
    base64: true,
          });
        });
        const content = await folder
          .generateAsync({ type: "blob" }) // zip下載
          .then(function (content) {
    return content;
          });
        saveAs(content, "二維碼.zip"); // zip下載后的名字
      };
    • 將 canvas 轉(zhuǎn)換成 base64 數(shù)據(jù),然后將 base64 數(shù)據(jù)保存到 zip 創(chuàng)建的 folder 中
    • folder 生成 generateAsync 內(nèi)容 content, 然后將 content 保存 saveAs 下載下來

    4. 正對 React 進(jìn)行封裝

    針對 React 封裝,我們需要考慮兩個(gè)大點(diǎn):

    • 觸發(fā)下載器,一般是一個(gè)按鈕
    • 原始需要展示的數(shù)據(jù)

    下面是一個(gè)封裝的示例, 基于 React 和 Antd 的內(nèi)容:

    import React from "react";
    import QRCode from "qrcode";
    import JSZip from "jszip";
    import { saveAs } from "file-saver";
    import { Button } from "antd";
    export default function QrCodeList({ trigger, list = [] }: any) {
      // canvas
      const gnVisiableCanvas = async () => {
        for (const item of list) {
          const canvas = document.createElement("canvas");
          canvas.style.display = "none";
          canvas.classList.add("__qrcode");
          canvas.setAttribute("name", item.name);
          await QRCode.toCanvas(canvas, item.url).catch((err) => {
    console.log("qr err", err);
          });
          document.body.appendChild(canvas);
        }
      };
      const destoryQrCodeWithURL = () => {
        const qrs = document.querySelectorAll(".__qrcode");
        qrs.forEach((qr: any) => {
          document.body.removeChild(qr);
        });
      };
      // 將 二維碼轉(zhuǎn)化成 圖片,然后放在壓縮包里面
      const createQrCodeWithURL = async () => {
        const zip = new JSZip();
        const folder = zip.folder("創(chuàng)建文件夾")!;
        await gnVisiableCanvas();
        const qrs = document.querySelectorAll(".__qrcode");
        qrs.forEach((qr: any) => {
          const data = qr.toDataURL().substring(22);
          folder.file(qr.getAttribute("name") + ".png", data, {
    base64: true,
          });
        });
        const content = await folder
          .generateAsync({ type: "blob" }) // zip下載
          .then(function (content) {
    return content;
          });
        saveAs(content, "二維碼.zip"); // zip下載后的名字
        destoryQrCodeWithURL();
      };
      const TriggerNew = () => {
        if (!trigger) {
          return (
    <Button type="primary" onClick={() => createQrCodeWithURL()}>
      批量生成二維碼
    </Button>
          );
        }
        return React.cloneElement(
          trigger,
          {
    onClick: () => {
      createQrCodeWithURL();
    },
          },
          trigger.props.children
        );
      };
      return <TriggerNew />;
    }

    5. 下載完畢

    繪制下載完畢之后,我們還需要將這些 dom 中的 html 元素找到并全部清理干凈。

    小結(jié)

    批量下載二維碼,一個(gè)很常見的應(yīng)用場景,本質(zhì)上實(shí)用 canvas 作用中間環(huán)節(jié)。然年實(shí)用 zip 壓縮等輔助工具將二維碼圖片放在壓縮包中存儲(chǔ)起來并下載。最后不要忘記移除之前的 canvas 等元素。

    以上就是根據(jù) url 批量下載二維碼的詳細(xì)內(nèi)容,更多關(guān)于根據(jù) url 批量下載二維碼的資料請關(guān)注其它相關(guān)文章!

    標(biāo)簽: JavaScript
    日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
    好吊视频一区二区三区四区| 日本精品一区二区三区在线观看视频| 国产乱码精品一区二区三区亚洲人| 日韩精品视频一区二区三区| 日韩极品在线观看| 欧美视频久久| 91亚洲国产成人久久精品| 国产亚洲精品美女久久久久久久久久| 青草国产精品| 亚洲人成高清| 国产精品v亚洲精品v日韩精品| 日本一区免费网站| 97精品一区| 免费久久久久久久久| 蜜桃伊人久久| 精品中文在线| 久久精品国产www456c0m| 日韩一区二区在线免费| 99精品美女| 综合视频一区| 亚洲美女久久精品| 亚洲香蕉久久| 麻豆精品在线播放| 精品日本视频| 亚洲一区免费| 久久精品国产久精国产| 成人av动漫在线观看| 久久精品超碰| 国产一区二区高清| 国产videos久久| 日本亚洲最大的色成网站www| 正在播放日韩精品| 日本国产欧美| 欧美日韩国产免费观看 | 日韩精品五月天| 国产美女高潮在线| 亚洲色图综合| se01亚洲视频 | 激情视频一区二区三区| 美女性感视频久久| 日本不卡一二三区黄网| 国产一级一区二区| 国产在线欧美| 久久久人人人| 麻豆成全视频免费观看在线看| 国产精品毛片aⅴ一区二区三区| 亚洲免费毛片| 久久午夜精品| 久久国产精品99国产| 久久影视一区| 久久蜜桃精品| 欧美aa在线观看| 黑人精品一区| 日韩在线综合| 亚洲不卡系列| 日韩欧美一区二区三区在线视频| 精品国产精品国产偷麻豆| 国产精品videossex久久发布| 欧美日韩1区2区3区| 奇米狠狠一区二区三区| 国产亚洲第一伦理第一区| 国产午夜精品一区在线观看| 久久激情五月婷婷| 欧美国产专区| 久久精品伊人| 精品理论电影在线| 日本一二区不卡| 在线亚洲人成| 欧美1级日本1级| 亚洲欧美视频| 欧美三级第一页| 成人高清一区| 99在线精品视频在线观看| 亚洲专区视频| 欧美aⅴ一区二区三区视频| 91亚洲国产| 亚洲在线观看| 欧美久久亚洲| 99久久99久久精品国产片果冰| 色婷婷久久久| 亚洲区欧美区| www.com.cn成人| 欧美精品九九| 欧美日韩午夜| 久久婷婷久久| 国产日韩三级| 亚洲国产一区二区在线观看| 久久国产日韩欧美精品| 色婷婷久久久| 国产日韩一区二区三区在线播放 | 日韩一区二区三区高清在线观看| 久久精品国产99国产| 在线国产一区| 国产日本精品| 精品中文字幕一区二区三区av| 久久国产乱子精品免费女| 欧美日韩视频免费观看| 91伊人久久| 欧美日韩国产精品一区二区亚洲| 久久精品99国产精品日本| 亚洲福利久久| 精品久久在线| 久久精品99久久久| 一本综合精品| 久久在线视频免费观看| 久久精品国产久精国产| 日本vs亚洲vs韩国一区三区二区| 亚洲黄色免费av| 欧美日韩亚洲一区在线观看| 悠悠资源网久久精品| 国产a亚洲精品| 美女视频一区在线观看| 91成人在线精品视频| 亚洲一区二区小说| 亚洲成人精选| 蜜桃国内精品久久久久软件9| sm捆绑调教国产免费网站在线观看| 欧美日韩网址| 欧美午夜网站| 国产乱码精品一区二区三区亚洲人| 亚洲精品在线a| 丝袜美腿成人在线| 99国产精品| 亚洲精品91| 性色一区二区| 丝袜美腿一区二区三区| 免费中文字幕日韩欧美| 亚洲一区国产一区| 日韩制服丝袜先锋影音| 亚洲理论在线| 国产精品超碰| 97精品一区二区| 99热国内精品| 中文精品在线| 亚洲精品麻豆| 欧美精品97| 久久久久久色| 日韩va亚洲va欧美va久久| 亚洲一二av| 国产精品啊v在线| 久久精品亚洲人成影院| 欧美日韩国产高清电影| 亚洲日本三级| 久久精品免费看| 日本精品影院| 亚洲精品黄色| 日本不卡免费高清视频在线| 久久福利精品| 精品国产精品国产偷麻豆| 久久亚洲在线| 日韩av影院| 日韩精品免费一区二区三区| 日本一不卡视频| 国产精品久久观看| 免费人成黄页网站在线一区二区| 国产精品一区免费在线| 欧美日韩激情| 国产一区精品福利| 久久午夜精品一区二区| 久久免费福利| 亚洲欧洲美洲国产香蕉| 国产在线|日韩| 日本午夜精品久久久| 国产综合色产| 精品视频97| 日韩精品乱码av一区二区| 秋霞影院一区二区三区| 国产精品一区二区三区av麻| 9色精品在线| 日韩不卡一区| 奇米亚洲欧美| 免费视频最近日韩| 黄色欧美日韩| 欧美日韩亚洲在线观看| 国产一区二区视频在线看| 91欧美精品| 亚洲精品免费观看| 国产精品女主播一区二区三区| 视频福利一区| 久久97久久97精品免视看秋霞| 欧美三区不卡| 欧美一区激情| 97精品资源在线观看| 亚洲欧美网站在线观看| 色婷婷精品视频| 国产超碰精品| 日本在线高清| 久久久久亚洲| 亚洲午夜91| 另类亚洲自拍| 亚洲欧美在线综合| 亚洲伊人精品酒店| 美女精品网站| 日韩精品一级| 国产精品白浆| 高清av一区| 亚洲国产专区校园欧美| 日韩一级网站| 亚洲色图综合| 亚洲免费毛片|