QrCode | 二维码
大约 2 分钟
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.vvbin.cn";
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