在table内展示二维码

注意:使用框架为Ant Design Vue
image.png

  • 安装vue-qrcode

注意:因为vue-qrcode依赖qrcode,所以还要安装qrcode

  1. npm install --save qrcode vue-qrcode
  • 引入vue-qrcode ``` import VueQrcode from ‘vue-qrcode’

components: { qrcode: VueQrcode }

  1. - **使用**

  1. <a name="Snnaj"></a>
  2. ### table内点击按钮,展示二维码
  3. - **安装qrcodejs2**

npm install —save qrcodejs2

  1. - **引入qrcodejs2**

import QRCode from “qrcodejs2”;

  1. - **使用qrcodejs2**
  2. 注意:当时用的框架是iview后台

Table: { data: [], columns: [ { type: “index” }, { title: “操作”, width: “250px”, render: (h, params) => { var btnList = []; btnList = [ h( “Button”, { attrs: { type: “warning”, size: “small” }, on: { click: () => { this.$nextTick(function() { this.qrcode(); }); } } }, “二维码” ) ] return h(“div”, btnList); } } ] }

  1. ```
  2. <!-- 展示二维码 -->
  3. <Modal
  4. :mask-closable="false"
  5. width="454px"
  6. v-model="codeModal.data.show"
  7. :title="codeModal.data.title"
  8. >
  9. <div id="qrcode-img">
  10. <div class="code-text code-title">{{this.codeModal.data.info.name}}</div>
  11. <div class="code-text code-info">{{this.codeModal.data.info.station}}</div>
  12. <div id="qrcode" ref="qrCodeUrl"></div>
  13. </div>
  14. <div slot="footer">
  15. <Button type="primary" @click="uploadCode">下载</Button>
  16. </div>
  17. </Modal>
  1. qrcode() {
  2. var canvas = document.getElementById("qrcode");
  3. canvas.innerHTML = "";
  4. const text =
  5. "https://xxx?code=xxx";
  6. this.qrcode = new QRCode(this.$refs.qrCodeUrl, {
  7. text: text,
  8. width: 300,
  9. height: 300,
  10. colorDark: "#000000",
  11. colorLight: "#ffffff",
  12. correctLevel: QRCode.CorrectLevel.H
  13. });
  14. },

下载二维码

方式一

  • 安装
    1. import html2canvas from 'html2canvas'
    1. <div slot="codeurl" slot-scope="text, record" :id="`qrcode`+record.id">
    2. <!-- 一定要给id -->
    3. <qrcode :value="text" :width="100" />
    4. </div>
    1. Downupload(record) {
    2. console.log('下载', record)
    3. const domObj = document.getElementById('qrcode' + record.id)
    4. // id一定要和上面的统一,要不然会报错:Cannot read property 'ownerDocument' of null
    5. html2canvas(domObj, {
    6. useCORS: true,
    7. allowTaint: false,
    8. logging: false,
    9. letterRendering: true,
    10. onclone(doc) {
    11. const e = doc.querySelector('#qrcode' + record.id)
    12. // id一定要和上面的统一,要不然会报错:Cannot read property 'ownerDocument' of null
    13. e.style.display = 'block'
    14. }
    15. }).then(function(canvas) {
    16. var oA = document.createElement('a')
    17. oA.download = record.name
    18. oA.href = canvas.toDataURL('image/png')
    19. document.body.appendChild(oA)
    20. oA.click()
    21. oA.remove()
    22. })
    23. }
    注意:下载二维码的时候,可能会因为浏览器导航条等的原因,出现下载图片空白或不全文件的问题

    方式二

    因为图片的形式是已经在本地生成的base64,所以可以直接通过a链接直接下载
  1. 创建一个a标签
  2. 将a标签的href属性赋值为图片的base64编码
  3. 指定a标签的download属性,作为下载文件的名称
  4. 触发a标签的点击事件
    1. Downupload(record) {
    2. const domObj = document.getElementById('qrcode' + record.id).getElementsByTagName('img')[0].src
    3. const a = document.createElement('a')
    4. a.href = domObj
    5. a.setAttribute('download', '文件名')
    6. a.click()
    7. }
    在ie浏览器里因为不支持setAttribute属性的原因,需要再进行判断
    1. Downupload(record) {
    2. const domObj = document.getElementById('qrcode' + record.id).getElementsByTagName('img')[0].src
    3. if (window.navigator.msSaveOrOpenBlob) {
    4. const bstr = atob(domObj.split(',')[1])
    5. let n = bstr.length // 在eslint规则内,不能修改使用const关键字声明的变量,它会引发运行时错误。
    6. const u8arr = new Uint8Array(n)
    7. while (n--) {
    8. u8arr[n] = bstr.charCodeAt(n)
    9. }
    10. const blob = new Blob([u8arr])
    11. window.navigator.msSaveOrOpenBlob(blob, 'chart-download' + '.' + 'png')
    12. } else {
    13. // 这里就按照chrome等新版浏览器来处理
    14. const a = document.createElement('a')
    15. a.href = domObj
    16. a.setAttribute('download', '文件名')
    17. a.click()
    18. }
    19. }