# QrCode

用于生成二维码的组件

# Usage

<template>
  <QrCode :value="qrCodeUrl" />
</template>
<script lang="ts">
  import { defineComponent, ref, unref } from 'vue';
  import { QrCode, QrCodeActionType } from '/@/components/Qrcode/index';
  import LogoImg from '/@/assets/images/logo.png';
  const qrCodeUrl = 'https://www.leencloud.com';
  export default defineComponent({
    components: { QrCode },
    setup() {
      const qrRef = ref<Nullable<QrCodeActionType>>(null);
      function download() {
        const qrEl = unref(qrRef);
        if (!qrEl) return;
        qrEl.download('文件名');
      }
      return {
        qrCodeUrl,
        LogoImg,
        download,
        qrRef,
      };
    },
  });
</script>
<style scoped>
  .qrcode-demo-item {
    width: 30%;
    margin-right: 1%;
  }
</style>

# Props

属性 类型 默认值 可选值 说明
value string - - 二维码地址
options QRCodeRenderersOptions - - 二维码配置 ,见 QRCodeRenderersOptions
width number 2 - 宽度
logo string|LogoType - - 中间 logo 配置,见 LogoType
tag 渲染标签 canvas canvas \| img img 不支持内嵌 logo

QRCodeRenderersOptions

/**
 * 定义margin的宽度。.
 * Default: 4
 */
margin?: number;
/**
 * 比例因子。值1表示每个模块1像素(黑点)。
 * Default: 4
 */
scale?: number;
/**
 * 为输出图像强制指定宽度。
 * 如果宽度太小而不能包含qr符号,则此选项将被忽略。
 * 优先于规模。
 */
width?: number;
color?: {
  /**
   * 暗模块的颜色。值必须为十六进制格式(RGBA).
   * 注意:深色应始终比color.light暗。.
   * Default: #000000ff
   */
  dark?: string;
  /**
   * 照明模块的颜色。值必须为十六进制格式(RGBA).
   * Default: #ffffffff
   */
  light?: string;
};

LogoType

{
  // logo图片
  src: string;
  // logo大小
  logoSize: number;
  // 背景颜色
  bgColor: string;
  // logo圆角
  logoRadius: number;
}

# Methods

名称 回调参数 说明
download Function(fileName:string) 下载

# 事件

名称 回调参数 说明
done (data: QrcodeDoneEventParams)=>void 绘制完成
error (error)=>void 生成二维码时发生错误

QrcodeDoneEventParams

{
  url: string;  // 二维码DataURL数据
  ctx?: CanvasRenderingContext2D;  // 该对象为画布的2D渲染上下文,仅在tag为canvas时有效,可用于自定义绘制
}

done 事件回调中可以对二维码进行自定义的绘制,示例代码如下:

<QrCode
  :value="qrCodeUrl"
  :width="200"
  @done="onQrcodeDone"
/>
function onQrcodeDone({ ctx }) {
  if (ctx instanceof CanvasRenderingContext2D) {
    // 额外绘制
    ctx.fillStyle = 'black';
    ctx.font = '16px "微软雅黑"';
    ctx.textBaseline = 'bottom';
    ctx.textAlign = 'center';
    ctx.fillText('你帅你先扫', 100, 195, 200);
  }
}

有关 CanvasRenderingContext2D 的更多资料以及绘制方法,请参考MDN (opens new window)

更新时间: 2023年2月28日星期二下午3点17分