当前位置: 首页 > news >正文

Vue3实战:集成jsBarcode与qrcode.vue实现批量标签打印

1. 为什么需要批量标签打印?

在仓库管理、实验室样品追踪等场景中,每个物品都需要唯一的标识。传统手工填写标签不仅效率低下,还容易出错。我曾经参与过一个医药仓库项目,他们原先用Excel打印标签再手动贴到货架上,经常出现标签与实物不符的情况。后来我们改用Vue3+条形码方案后,错误率直接降为零。

批量标签打印的核心需求可以总结为三点:

  • 唯一性:每个物品必须有独立的条形码/二维码
  • 批量处理:需要一次性生成数十甚至上百个标签
  • 打印控制:精确控制每张标签的排版和打印效果

2. 环境搭建与基础配置

2.1 创建Vue3项目

推荐使用Vite快速初始化项目:

npm create vite@latest barcode-print --template vue cd barcode-print npm install

2.2 安装核心依赖

这三个库是项目的核心支柱:

npm install jsbarcode qrcode.vue print-js

我建议在package.json中固定版本号,避免后续版本更新导致API变化:

"dependencies": { "jsbarcode": "^3.11.5", "qrcode.vue": "^3.3.3", "print-js": "^1.6.0" }

3. 条形码生成实战

3.1 jsBarcode基础使用

在组件中引入并生成基础条形码:

import JsBarcode from 'jsbarcode' const generateBarcode = () => { JsBarcode('#barcode', '12345678', { format: 'CODE128', width: 2, height: 60, displayValue: true }) }

常见坑点

  1. 元素必须已经渲染到DOM中才能生成条形码
  2. 同一个元素重复生成会覆盖前一个
  3. 特殊字符需要额外处理

3.2 批量生成解决方案

通过v-for循环配合动态ID实现批量生成:

<template> <div v-for="(item, index) in items" :key="item.id"> <img :id="'barcode-'+index" class="barcode-img"> </div> </template> <script> export default { methods: { generateAllBarcodes() { this.items.forEach((item, index) => { JsBarcode(`#barcode-${index}`, item.code, { format: 'CODE39', lineColor: '#000', width: 1.5 }) }) } } } </script>

4. 二维码集成方案

4.1 qrcode.vue基础配置

这个组件使用起来非常简单:

<template> <qrcode-vue :value="qrText" :size="150" level="H" :margin="10" /> </template> <script> import QrcodeVue from 'qrcode.vue' export default { components: { QrcodeVue }, data() { return { qrText: 'https://example.com/item/123' } } } </script>

参数说明

  • size:控制二维码物理尺寸
  • level:纠错级别(L/M/Q/H)
  • margin:二维码边距

4.2 动态内容生成

结合业务数据动态生成内容:

computed: { qrCodes() { return this.items.map(item => ({ id: item.id, value: `${window.location.origin}/item/${item.id}` })) } }

5. 打印功能实现

5.1 PrintJS基础配置

最简单的打印调用方式:

printJS({ printable: 'print-area', type: 'html', style: '@page { size: auto; margin: 0mm; }' })

关键参数

  • printable:要打印的区域ID
  • type:支持html/image/pdf/json
  • style:自定义打印样式

5.2 打印样式控制

必须掌握的CSS打印技巧:

@media print { body * { visibility: hidden; } #print-area, #print-area * { visibility: visible; } #print-area { position: absolute; left: 0; top: 0; } }

建议使用专门的打印样式表:

<link rel="stylesheet" media="print" href="print.css">

6. 完整解决方案实现

6.1 组件结构设计

推荐的文件结构:

components/ LabelPrinter/ LabelItem.vue # 单个标签模板 LabelPreview.vue # 预览组件 PrintController.vue # 打印控制

6.2 数据流处理

使用Pinia管理标签数据:

// stores/labelStore.js export const useLabelStore = defineStore('labels', { state: () => ({ items: [], template: 'default' }), actions: { async loadItems() { const res = await api.get('/items') this.items = res.data.map(item => ({ ...item, barcode: generateBarcodeValue(item) })) } } })

6.3 性能优化技巧

  1. 虚拟滚动:处理大批量标签时使用vue-virtual-scroller
  2. 生成节流:使用requestIdleCallback分批生成
  3. 缓存机制:对已生成的条码进行缓存
const generateBarcodes = () => { if (!window.requestIdleCallback) { // 兼容方案 items.value.forEach(genBarcode) } else { let index = 0 const processItem = (deadline) => { while (index < items.value.length && deadline.timeRemaining() > 0) { genBarcode(items.value[index]) index++ } if (index < items.value.length) { requestIdleCallback(processItem) } } requestIdleCallback(processItem) } }

7. 常见问题排查

7.1 条码显示不全

可能原因及解决方案:

  1. 容器尺寸不足:检查img元素的width/height
  2. 打印边距问题:调整@page的margin
  3. 缩放问题:避免使用transform缩放

7.2 打印内容错位

调试步骤:

  1. 检查打印预览与实际效果差异
  2. 确认所有尺寸单位使用px或mm
  3. 测试不同浏览器的打印效果

7.3 异步渲染问题

推荐解决方案:

await nextTick() generateBarcodes() setTimeout(print, 300) // 确保所有内容渲染完成

8. 进阶功能扩展

8.1 模板自定义

实现动态模板选择:

const templates = { simple: { fields: ['name', 'barcode'], style: `...` }, detailed: { fields: ['name', 'code', 'barcode', 'qr'], style: `...` } }

8.2 数据库集成

典型的数据流转方案:

  1. 从ERP系统获取物品列表
  2. 生成标签数据并缓存
  3. 记录打印日志

8.3 移动端适配

针对移动设备的优化:

@media (max-width: 768px) { .label-item { width: 100%; margin: 5px 0; } }
http://www.jsqmd.com/news/517336/

相关文章:

  • Ollama上的小模型大能量:granite-4.0-h-350m7大功能体验
  • 避坑指南:Flutter镜像配置中常见的5个错误及解决方法
  • OpenWrt路由器破解校园网限速:基于深澜(srun)认证的百兆宽带满速实战
  • ElementUI实战:从零搭建Vue项目到登录界面优雅实现
  • 打卡信奥刷题(2995)用C++实现信奥题 P6146 [USACO20FEB] Help Yourself G
  • 亚马逊Nova AI挑战赛:加速生成式AI安全研究
  • OpenClaw云端体验方案:星图平台Qwen3-32B镜像快速验证AI助手
  • java非访问控制修饰符有哪些
  • RT-Thread SPI设备封装实战:如何正确关联rt_spi_send与自定义write函数
  • 2026年中国营销管理咨询公司推荐:中小企业营销增长口碑机构及服务模式深度对比 - 十大品牌推荐
  • 好用还专业!10个降AIGC软件全学科适配测评,帮你高效降AI率
  • uniapp键盘高度获取全攻略:解决安卓/iOS虚拟键导致的定位偏差
  • EM算法中的Q函数:从三硬币模型到实际应用的完整推导指南
  • 从零理解电动机工作原理:5个关键公式带你读懂电机铭牌参数
  • 从零到一:手把手教你用Android Studio离线打包UniApp安卓应用
  • Spring新手必看:IOC容器中Bean的5个关键操作(含containsBean使用场景)
  • 语音处理不求人:用ClearerVoice-Studio轻松搞定会议纪要音频
  • 2026年羊绒衫厂家推荐:品牌合作ODM定制从设计到生产一站式解决方案 - 十大品牌推荐
  • Java中如何使用Scanner读取输入数据
  • 国家中小学智慧教育平台电子课本下载终极指南:三步获取全科教材PDF
  • 黑盒 vs 白盒测试:5个真实项目案例教你如何选择测试方法
  • 告别抓包烦恼:用Postern+Charles搞定雷电模拟器里所有难抓的App流量
  • 2025-2026年羊绒衫厂家推荐:设计师品牌合作与柔性供应链口碑厂家分析 - 十大品牌推荐
  • 2026年中国营销管理咨询公司推荐:企业数字化转型期营销策略靠谱选择与口碑分析 - 十大品牌推荐
  • 保姆级教程:用ROS Noetic在Ubuntu 20.04上配置RealSense D455与机械臂手眼标定(附常见错误排查)
  • 从零到一:F28379D SCI串口通信实战配置与调试指南
  • Buck - Boost双向DC - DC电源学习资料大揭秘
  • Wireshark实战:3步搞定HTTPS证书抓包与导出(附浏览器备用方案)
  • 如何为Java初学者配置最简洁的开发环境
  • 中国营销管理咨询公司如何选不踩坑?2026年靠谱推荐聚焦业绩对赌与效果保障型服务 - 十大品牌推荐