Files
mini-yu/uni_modules/tdesign-uniapp/components/qrcode/qrcode.vue

145 lines
3.3 KiB
Vue
Raw Normal View History

2026-02-10 08:05:03 +08:00
<template>
<view
:style="`${tools._style([customStyle])}; width:${containerSize}px; height: ${containerSize}px; background-color: ${bgColor};`"
:class="`${classPrefix} ${borderless ? prefix + '-' + 'borderless' : ''} ${tClass}`"
>
<QrcodeCanvas
ref="qrcodeCanvas"
:t-class="tClassCanvas"
:size="size"
:value="value"
:level="level"
:color="color"
:bg-color="bgColor"
:icon="icon"
:icon-size="iconSize"
@drawError="handleDrawError"
@drawCompleted="handleDrawCompleted"
/>
<view
v-if="showMask && canvasReady"
:class="`${prefix}-mask`"
>
<QrcodeStatus
:status="status"
:status-render="statusRender"
@refresh="handleRefresh"
>
<template #statusRender>
<slot name="statusRender" />
</template>
</QrcodeStatus>
</view>
</view>
</template>
<script>
import QrcodeCanvas from './components/qrcode-canvas/qrcode-canvas.vue';
import QrcodeStatus from './components/qrcode-status/qrcode-status.vue';
import { prefix } from '../common/config';
import props from './props';
import { uniComponent } from '../common/src/index';
import tools from '../common/utils.wxs';
const name = `${prefix}-qrcode`;
export default uniComponent({
name,
options: {
styleIsolation: 'shared',
},
externalClasses: [
`${prefix}-class`,
`${prefix}-class-canvas`,
],
components: {
QrcodeCanvas,
QrcodeStatus,
},
props: {
...props,
},
data() {
return {
prefix,
tools,
showMask: false,
classPrefix: name,
canvasReady: false,
canvasNode: null,
};
},
computed: {
// 容器尺寸 = Canvas 尺寸 + padding * 2
// padding 为 12px所以容器需要额外 24px
containerSize() {
return this.size + 24;
},
},
watch: {
status: {
handler(newVal) {
this.showMask = newVal !== 'active';
},
immediate: true,
},
},
mounted() {
this.initCanvas();
},
methods: {
async initCanvas() {
// 获取 canvas 实例
const canvasComp = this.$refs.qrcodeCanvas;
if (canvasComp) {
const canvas = await canvasComp.getCanvasNode();
this.canvasNode = canvas;
}
},
// 用于外部调用,重新绘制二维码
init() {
const canvasComp = this.$refs.qrcodeCanvas;
if (canvasComp) {
canvasComp.initCanvas();
}
},
handleDrawCompleted() {
this.canvasReady = true;
},
handleDrawError(err) {
console.error('二维码绘制失败', err);
},
handleRefresh() {
this.$emit('refresh');
},
// 二维码下载方法
async handleDownload() {
if (!this.canvasNode) {
console.error('未找到 canvas 节点');
return;
}
// 注意:此方法在非小程序环境需要适配
if (typeof wx !== 'undefined' && uni.canvasToTempFilePath) {
uni.canvasToTempFilePath({
canvas: this.canvasNode,
success: (res) => {
uni.saveImageToPhotosAlbum({ filePath: res.tempFilePath });
},
fail: (err) => {
console.error('canvasToTempFilePath failed', err);
},
});
}
},
},
});
</script>
<style lang="less" scoped>
@import './qrcode.css';
</style>