You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

193 lines
5.3 KiB

3 months ago
<template>
<view @longtap.stop="longtap">
<canvas
:width="info.orient == 'vertical' ? info.destHeight : info.destWidth "
:height="info.orient == 'vertical' ? info.destWidth : info.destHeight"
:canvas-id="item.id"
:id="item.id"
:style="{width:info.orient == 'vertical' ? info.height : info.width,height: info.orient == 'vertical' ? info.width : info.height}"
v-for="item in info.listCode"
:key="item.id"
@error="handleError"></canvas>
</view>
</template>
<!-- #ifdef VUE3 -->
<script setup name="WBarcode">
import {
reactive,
watch,
onMounted,
nextTick,
getCurrentInstance,
} from 'vue';
import {
BarCode,
GetImg,
GetPixelRatio,
GetPx ,
} from '@/uni_modules/wmf-code/js_sdk/index.js';
import {
getUUid,
deepClone,
platform,
} from '../../common/helper.js'
//定义props
const props = defineProps({
options:{
type: Object,
required: true,
default: () =>{
return {}
}
}
});
const emits = defineEmits(['generate','press','error'])
const opt = props.options;
const that = getCurrentInstance();
const HSize = opt.text ? opt.text.size || 40 + opt.text.padding || 20 : 0;
let info = reactive({
id: getUUid(),
destWidth: GetPixelRatio() * GetPx(opt.width) + 'px',
destHeight: GetPixelRatio() * GetPx(opt.height + HSize) + 'px',
width: GetPx(opt.width) + 'px',
height: GetPx(opt.height + HSize) + 'px',
orient: opt.orient || 'horizontal',
listCode: []
})
onMounted(()=>{
SpecialTreatment(opt);
nextTick(()=>{
generateCode(opt)
})
});
watch(()=>props.options,(val)=>{
SpecialTreatment(val);
const HSize = val.text ? val.text.size || 40 + val.text.padding || 20 : 0;
info.destWidth= GetPixelRatio() * GetPx(val.width) + 'px',
info.destHeight= GetPixelRatio() * GetPx(val.height + HSize) + 'px',
info.orient = val.orient || 'horizontal',
info.width= GetPx(val.width) + 'px',
info.height= GetPx(val.height + HSize) + 'px',
setTimeout(()=>{
generateCode(val)
},100)
},{ deep: true })
const generateCode = (val)=> {
try{
const parameter = {...val,source: platform(),id: info.id,ctx: that};
BarCode(parameter,(res)=>{
emits('generate',res)
})
}catch(err){console.warn(err)}
}
const GetCodeImg = async ()=> {
try{
return await GetImg({id: info.id,width: opt.orient == 'vertical' ? opt.height : opt.width,height: opt.orient == 'vertical' ? opt.width : opt.height,ctx: that});
}catch(e){console.warn(e)}
};
const SpecialTreatment = (val) => {//渲染多个canvas特殊处理
let obj = deepClone(val);
obj.id = info.id;
info.listCode = [obj];
};
// 长按事件
const longtap = (e)=>{
emits('press',e)
}
// canvas创建错误 触发
const handleError = (e)=>{
emits('error',e.detail)
}
</script>
<!-- #endif -->
<!-- #ifndef VUE3 -->
<script>
import { BarCode, GetImg,GetPixelRatio,GetPx } from '@/uni_modules/wmf-code/js_sdk/index.js';
import { getUUid, deepClone,platform } from '../../common/helper.js'
export default {
name: 'WBarcode',
props:{
options:{
type: Object,
required: true,
default: () =>{
return {
}
}
}
},
data () {
return {
info:{
destHeight: 0,
destWidth: 0,
width: 0,
height: 0,
listCode: [],
orient: 'horizontal'
},
id: getUUid()
}
},
mounted() {
const HSize = this.options.text ? ((this.options.text.size || 40) + ( this.options.text.padding || 20)) : 0;
this.info.height = GetPx(this.options.height + HSize) + 'px';
this.info.orient = this.options.orient || 'horizontal';
this.info.width = GetPx(this.options.width) + 'px';
this.info.destHeight = GetPx(this.options.height + HSize) * GetPixelRatio() + 'px';
this.info.destWidth = GetPx(this.options.width) * GetPixelRatio() + 'px';
this.SpecialTreatment(this.options)
this.$nextTick(()=>{
this.generateCode();
})
},
watch: {
options:{
deep: true,
handler (val) {
const HSize = val.text ? val.text.size || 40 + val.text.padding || 20 : 0;
this.info.height = GetPx(val.height + HSize) + 'px';
this.info.width = GetPx(val.width) + 'px';
this.info.destHeight = GetPx(val.height + HSize) * GetPixelRatio() + 'px';
this.info.destWidth = GetPx(val.width) * GetPixelRatio() + 'px';
this.info.orient = val.orient || 'horizontal'
this.SpecialTreatment(val)
setTimeout(()=>{// h5平台动态改变canvas大小
this.generateCode();
},100)
}
}
},
methods: {
longtap (e){
this.$emit('press',e)
},
handleError (e) {//当发生错误时触发 error 事件,字节跳动小程序与飞书小程序不支持
this.$emit('error',e.detail)
},
SpecialTreatment (val) {//微信小程序渲染多个canvas特殊处理
let obj = deepClone(val);
obj.id = this.id;
this.info.listCode = [obj]
},
generateCode () {
try{
const parameter = {...this.options,source: platform(),id: this.id,ctx: this};
BarCode(parameter,(res)=>{
this.$emit('generate',res)
})
}catch(err){}
},
async GetCodeImg (){
try{
return await GetImg({id: this.id,width: this.options.orient == 'vertical' ? this.options.height : this.options.width,height: this.options.orient == 'vertical' ? this.options.width : this.options.height,ctx: this});
}catch(e){}
}
}
}
</script>
<!-- #endif -->