ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Vue字符串生成条形码实战:JsBarcode组件封装与动态更新指南

Vue字符串生成条形码实战:JsBarcode组件封装与动态更新指南 1. 需求拆解与方案选型1.1 搞清楚字符串变条形码到底在解决什么问题先说说我为什么关注这个需求。我手上接过不少类似的项目库存管理系统要给物料编号生成条形码、扫码捡货的PDA端要显示货架码、订单系统要打印快递单号条码甚至还有做固定资产盘点的时候要把资产编号贴到设备上。这些场景里都存在一个共同需求——用户给一个字符串一串编号、序列号、URL需要在前端把它渲染成一幅可识别的条形码图片。这里有个容易搞混的点条形码和二维码是两回事。条形码是一维的由一组宽度不同的黑白竖条组成能编码的信息长度有限二维码是二维的能在更小面积里塞进更多内容。标题里明确说的是字符串生成条形码所以我们聚焦一维条码最常见的是 Code128、Code39、EAN-13 这类标准。不要一上来就找 qrcode 库那是另一个方向。再往下拆需求里其实藏着三层问题第一层怎么把一个普通的字符串变成符合编码规范的条和空第二层在 Vue 项目里这个转换过程怎么和组件生命周期、DOM 渲染结合起来第三层条形码生成后怎么做到清晰、可扫描、可打印、可下载如果只是临时用用直接在 HTML 里引入一个 CDN 的 JsBarcode 也能跑。但在真实项目里你大概率需要把它封装成 Vue 组件或公共函数供多个页面复用还得处理动态更新、canvas 与 SVG 的选择、高分辨率打印适配等问题。这篇文章我就按这个思路从零开始说清楚。1.2 为什么选 JsBarcode 而不是手写 canvas条形码生成的库目前前端用得最多的就是JsBarcode。有人会问这不就是画几条线吗我自己用 canvas 画不行吗当然可以画但能画出来和能被扫码枪识别完全是两个层级的事。一条能被扫码枪稳定识别的条形码需要满足几个要求不同字符对应不同的编码组合起始符/终止符需要符合标准每个条和空的宽度要符合模块宽度的整数倍关系右侧要留白quiet zone甚至还要按需计算校验位。这些细节手写起来非常繁琐而且超级容易出错——你以为你画了一个条形码扫码枪扫出来却是一堆乱码。JsBarcode 之所以是事实标准就是因为它在底层把这些规范全都处理好了你只需要告诉它内容是什么、用哪种编码格式。从社区活跃度和维护状态看JsBarcode 也是比较稳的选择。它体积不大、无依赖同时支持 canvas 和 SVG 两种渲染方式API 非常直观。npm 上每周下载量不小GitHub 上 issue 回复也及时遇到问题基本能搜到答案。相比之下另一个老牌库条形码生成依赖较多功能强但更重在纯前端 Vue 项目里用起来反而显得冗余。1.3 技术方案的整体思路我最终确定的技术组合是Vue 2 / Vue 3 JsBarcode。核心思路就一条把字符串当作数据源把条形码当作视图输出中间的桥梁是 JsBarcode 的渲染方法。这一步关键点是理解 Vue 的响应式数据流。字符串是响应式的ref 或 data渲染条形码的动作必须放在正确的时机。在 Vue 2 里通常放在updated或$nextTick在 Vue 3 里则用watchEffect或watch nextTick搭配自定义指令或组件方法。难点不在于 JsBarcode API 本身而在于 Vue 更新时机和 canvas 元素挂载时机之间的协调。搞不定这一步你会发现字符串改了条形码不跟着变或者干脆报错说 canvas 元素找不到。第二层思路是渲染方式选型。JsBarcode 支持canvas和svg两种。canvas 适合打印、生成图片下载svg 适合页面展示、贴前端界面清晰度不受分辨率影响。实际项目里我经常会做成可配置的页面预览用 svg打印导出用 canvas这样两边优点都能吃到。第三层思路是组件化复用。一个完整的条形码模块应当包含输入字符串、编码格式选择、显示宽度/高度配置、显示文本开关、渲染后的图片下载方法。封装成 Vue 组件后任何页面只需要传一个字符串就能出码后续维护起来也省心。2. 核心原理与编码基础2.1 一维条形码到底是怎么把字符串编码成条空的这是很多人忽略但非常关键的一层。你告诉 JsBarcode 我要生成 Code128 格式它内部做的事情可以拆成三步第一步按编码标准查表。Code128 编码表里有 107 个符号每个符号对应 6 个模块宽度组合成的条/空模式每个符号由 3 个条和 3 个空组成每个条/空由 1-4 个模块构成。字符串里的每个字符都通过 ASCII 码映射到对应的符号。字符串 ABC123 会被拆成 6 个字符每个字符查表得到一个 6 段宽度的模式。第二步拼接控制符号。一维条码不能只编码内容它还需要起始符、终止符和校验符。Code128 有三个起始符Code A、Code B、Code C分别对应不同的字符集终止符是固定的校验符是根据字符串内容做加权计算得到的。JsBarcode 默认会帮我们做字符集选择和校验符计算所以你传一个普通字符串进去它能自动决定用哪个起始符最划算。第三步确定每个模块宽度的像素值。条形码图形里一个模块到底画几个像素宽取决于你传入的width参数。如果 width 设为 2那一个模块就是 2 像素。条形码的总宽度 所有符号的模块数之和 × 单模块像素宽。这里有一个重要的约束同一个条形码里不同符号的同级模块宽度必须相等否则扫码枪的激光在时间轴上就没法对齐了。JsBarcode 内部会把所有符号统一成同一个模块宽度确保整体一致。2.2 Code128 vs Code39 vs EAN-13 怎么选我遇到过不少同事条形码能出来就行完全不看格式。结果客户那边扫码设备不支持或者扫出来内容跟预想的不一样。这里有必要说清楚区别。编码格式支持字符长度限制适用场景缺点Code128全 ASCII变长无严格上限通用、物流、内部管理无Code39数字、大写字母、部分符号变长通常建议短汽车、军工、部分老系统密度低条较宽EAN-1313 位数字固定 13 位零售商品、超市扫码只能纯数字位数固定EAN-88 位数字固定 8 位商品小包装容量小UPC-A12 位数字固定 12 位北美零售区域性强做内部管理系统的时候我几乎都用 Code128因为能编码任意字符串字母数字混合没问题密度高实际占用宽度小通用性好。如果客户明确要求零售条码且是 EAN 体系那就老老实实用 EAN-13这种格式涉及国家编码和组织代码还需要申请厂商识别码不是随便拿个字符串就能生成的。先跟客户确认格式比写代码重要得多。有一种常见误区是Code39 也能编字母数字为什么不用因为 Code39 的信息密度低同样内容它比 Code128 宽出一大截在标签宽度有限的环境下很容易塞不下。除非客户要求和既有系统保持兼容否则一律建议 Code128。2.3 条形码右侧留白Quiet Zone为什么不能省很多刚开始接触条形码的人会忽略一个隐藏参数margin。JsBarcode 默认在条形码两侧留白但这个值不是随便给的。条形码规范要求左侧和右侧各保留至少 10 倍模块宽度的空白区Code128 要求是 10x否则扫码设备在识别时找不到码的起止边界就会读失败。我在实际项目中遇到过非常典型的坑给仓库打印货架标签打印机有边距裁切功能操作员为了省纸把条形码左右边距裁到几乎为零。结果就是同一张标签手机扫没问题仓库固定式扫码枪经常扫不出来。后来对比完好标签和问题标签发现就是留白被裁掉导致的。所以封装组件时margin最好设为最小值 10 或默认值 20同时用 CSS 给容器加padding双保险。还有一点需要注意当条形码图片被 CSS 缩放时留白和条宽是等比例缩小的缩得太小同样会导致扫码失败。后面讲打印适配时我会专门说这个问题。3. Vue 项目里的完整实现过程3.1 环境准备与依赖安装先说准备工作。无论 Vue 2 还是 Vue 3安装 JsBarcode 的方式都一样npm install jsbarcode --save如果项目用的是 yarnyarn add jsbarcode安装完之后我会在main.js里全局注册一次这样所有组件里都能直接用指令方式调用不用每个文件都 import 一遍import JsBarcode from jsbarcode Vue.use(JsBarcode) // Vue 2 写法如果是 Vue 3 Composition API 项目稍微有点区别。jsbarcode 没有官方的 Vue 3 插件我更推荐按需引入而不是全局注册import JsBarcode from jsbarcode也可以把它封装成一个自定义指令// directives/barcode.js import JsBarcode from jsbarcode const barcodeDirective { mounted(el, binding) { const { value, options } binding JsBarcode(el, value, options || {}) }, updated(el, binding) { const { value, options } binding JsBarcode(el, value, options || {}) } } app.directive(barcode, barcodeDirective)这样在模板里可以用canvas v-barcodebarcodeText :options{format: CODE128}/canvas自定义指令的好处是关注点分离视图里不需要关心渲染逻辑只要维护好字符串数据。如果你不喜欢指令这种半隐式写法组件化方案更直接——我下一步就来讲。3.2 从零封装一个条形码组件组件化是我在正式项目里最常用的方式。一个条形码组件应该承担这些职责接收字符串内容、接收样式与格式配置、渲染到 canvas 或 svg、暴露下载图片的方法。我提供一个 Vue 3 版本的参考实现template div classbarcode-wrapper canvas refcanvasRef v-showrenderType canvas/canvas svg refsvgRef v-showrenderType svg/svg /div /template script setup import { ref, watch, onMounted, defineProps, defineExpose } from vue import JsBarcode from jsbarcode const props defineProps({ value: { type: String, required: true }, format: { type: String, default: CODE128 }, width: { type: Number, default: 2 }, height: { type: Number, default: 60 }, displayValue: { type: Boolean, default: true }, fontSize: { type: Number, default: 14 }, margin: { type: Number, default: 10 }, renderType: { type: String, default: canvas // canvas / svg } }) const canvasRef ref(null) const svgRef ref(null) const renderBarcode () { const el props.renderType canvas ? canvasRef.value : svgRef.value if (!el) return JsBarcode(el, props.value, { format: props.format, width: props.width, height: props.height, displayValue: props.displayValue, fontSize: props.fontSize, margin: props.margin }) } onMounted(() { renderBarcode() }) watch( () [props.value, props.format, props.width, props.height, props.displayValue, props.fontSize, props.margin, props.renderType], () { renderBarcode() }, { deep: true } ) const downloadBarcode (filename barcode) { const canvas canvasRef.value if (!canvas) return const link document.createElement(a) link.download ${filename}.png link.href canvas.toDataURL(image/png) link.click() } defineExpose({ downloadBarcode }) /script这段代码里有几个细节是很容易踩坑的第一渲染时机。组件挂载后才会有 canvas/svg 元素所以第一次渲染放在onMounted里。字符串后续变化则通过watch监听。这里用一个数组来监听多个 prop可以避免写一堆重复的 watch。第二为什么默认用 canvas。因为打印、导出图片的基础就是 canvas。如果用 svg 渲染download 就得转成 canvas会多一道流程。但 svg 在界面上显示更清晰、无锯齿。所以组件保留renderType切换能力默认 canvas 足够通用。第三downloadBarcode为什么要暴露。因为生成条形码只是第一步把它保存为图片才是实际业务里高频出现的需求。封装成方法后父组件可以通过 ref 调用它。3.3 在业务页面里怎么调用组件封装好之后页面里的调用就非常清爽了。比如做一个物料管理的表单输入编号后实时生成条码预览template div el-input v-modelmaterialNo placeholder请输入物料编号 / Barcode refbarcodeRef :valuematerialNo || NO-DATA :width2 :height80 :font-size16 :margin10 formatCODE128 / el-button clickhandleDownload下载条码图片/el-button /div /template script setup import { ref } from vue import Barcode from /components/Barcode.vue const materialNo ref() const barcodeRef ref(null) const handleDownload () { if (!materialNo.value) { alert(请先输入物料编号) return } barcodeRef.value.downloadBarcode(materialNo.value) } /script一个容易被忽略的小点当materialNo为空字符串时JsBarcode 会渲染出一个空白条码。所以我在模板里做了兜底判断用NO-DATA作为占位页面体验会好很多。3.4 字符串内容的预处理实际业务中用户输入的字符串往往不是干净的可能有空格、有小写字母、带特殊符号、甚至混入中文。这些都会导致 JsBarcode 渲染异常或者扫码结果不符合预期。我总结了一套预处理流程统一转大写物料编号通常不区分大小写但为了格式统一建议toUpperCase()。去除首尾空格前端输入框很容易带出空格这会导致可变长度编码比预期宽还可能让扫码结果带空白字符比较恶心。过滤非法字符如果确定业务编号只用数字和大写字母用正则过滤掉其他字符。中文怎么办Code128 只支持 ASCII中文无法直接编码。要么业务上不允许中文进条码要么将中文替换成拼音缩写或业务映射编码。在封装组件内部做好输入清洗可以避免很多后端数据项里出现脏数据后前端直接白屏。下面这段是我在项目中沉淀下来的清洗逻辑放在组件里作为 mounted 前的一道关卡const cleanValue (raw) { if (!raw) return const upper String(raw).toUpperCase().trim() // 业务编号规则字母、数字、短横线、下划线 const filtered upper.replace(/[^A-Z0-9\-_]/g, ) return filtered }不过注意cleanValue不一定适合所有业务。如果客户就是要生成包含空格的产品名条形码你强行过滤掉空格反而出错。正确的做法是在组件里提供sanitizeprop默认关闭在需要预处理的场景由调用方按需开启。4. 动态更新与多场景扩展实战4.1 为什么有时候值变了图不刷新这大概是 JsBarcode 在 Vue 里最常见的坑。很多人的第一版代码长这样changeValue() { this.barcodeValue NEW123 JsBarcode(this.$refs.barcode, this.barcodeValue) }结果是字符串值确实变了但条形码纹丝不动甚至报错。根因是什么Vue 的 DOM 更新是异步的。你以为this.barcodeValue NEW123之后立即访问this.$refs.barcode它就已经更新了实际上 Vue 要等本轮事件循环末尾统一 patch DOM。这个时候你调用 JsBarcode 去读 canvas它读到的还是旧渲染结果或者因为 canvas 被 Vue 重新创建了引用还停留在旧节点上然后就崩了。解决办法有两条路路径一watch nextTick。watch: { barcodeValue(newVal) { this.$nextTick(() { JsBarcode(this.$refs.barcode, newVal, this.options) }) } }路径二自定义指令的双钩子。在updated钩子里执行渲染和 Vue 的更新周期天然对齐不用手动调 nextTick。这也是前面自定义指令方案更省心的原因。另外提一嘴Vue 3 里同样的场景watch配合nextTick也是安全写法。如果用watchEffect注意它的执行时机是依赖变化后的同步阶段此时 DOM 尚未更新单纯watchEffect直接调用 JsBarcode 同样会拿不到新节点。要手动加上await nextTick()或者在watch里调 nextTick 回调。4.2 表单联动、批量生成与条码流水线条形码很少独立存在它通常是表单流程的一部分。我做过一个比较完整的场景是批量打印资产标签用户勾选一批资产记录点生成标签系统遍历每条记录分别生成条形码图片再统一拼版打印。这个场景里有一个连环细节如果用一个 canvas 循环渲染多张条码第二次调用 JsBarcode 前必须先清空上一个 canvas否则两者叠加在一起。JsBarcode 每次调用实际上会自动清空目标元素上的旧内容但前提是你传入的是同一个 canvas 元素。如果循环里不小心用了同一个 canvas 而前一次还没渲染完UI 线程可能会因为同步大循环而卡死。更稳妥的批量方案是逐条生成到离屏 canvas然后转成图片 URL 塞入数组const generateBarcodeImages (items) { return items.map(item { const canvas document.createElement(canvas) JsBarcode(canvas, item.code, { format: CODE128, width: 2, height: 80 }) return canvas.toDataURL(image/png) }) }这里用document.createElement而不是模板里挂载的节点好处是渲染过程完全脱离 DOM 可见区域页面不会一帧一帧地跳动。缺点是需要自己管理内存用完的图片 URL 记得释放revokeObjectURL只针对 blob URL这里用toDataURL就没这个烦恼。4.3 在表格里生成多个条码的性能注意点有一种需求是在表格列的每一行显示该行数据的条形码。如果表格一次渲染 100 行每行都挂一个 canvas 组件性能压力不小。我的做法是用懒渲染/虚拟列表表格只渲染可视区域的 30 行左右条形码组件只在行进入可视区域时挂载渲染。如果不想引入虚拟列表库可以采用点击放大再渲染的交互默认行内只是文本用户展开某一行才生成条形码。这样既省性能也避免页面一打开就卡顿。另一个性能优化点是 JsBarcode 的模块宽度。条码建议总宽度不要超过容器的 1.5 倍。如果容器是 300px那设置width: 2 20 位左右的字符串按 Code128 的密度总宽通常在 260px 上下刚刚合适。如果字符串长可以调小width到 1.5或者缩短height视觉上既协调又不会太宽。4.4 把组件改造成文本框、样式与校验的完整交互真实业务需要的往往不只是渲染出一个码还包括用户输入时实时预览、非法字符即时提示、码内容过短/过长的校验、条码下方同时显示人眼可读的文本。这部分我在组件里做了三处扩展输入校验反馈监听输入内容通过正则预检匹配到非法字符后在表格里用红字标出位置不急着清理让用户知道自己错在哪。条码长度提示Code128 没有硬性上限但太长条码打印出来很宽。我设了一个 30 位警告阈值超过后在控制台 warn前台提示条码过长建议缩短或扩大宽度。字号与条高的联动当条码高度比较矮时如果displayValue开启文字会挤压条高我做了简单联动让字号随高度自适应fontSize: height 40 ? 10 : 14。这些看似细枝末节的功能恰恰是在真实业务里最容易赢得客户好感的地方。毕竟客户不关心你用的是什么库他只看这个输入框为什么我输了个斜杠就报错了和条码为什么这么挤。5. 常见问题与排查技巧实录5.1 条码扫不出来的几类原因扫码扫不出来优先级最高的问题永远是打印或显示尺寸是否合规。下面是排查顺序建议按这个顺序检查表现可能原因排查方式解决动作屏幕扫码无反应canvas 宽度过小条太密量一下实际 DOM 宽度调大 width 参数打印后扫不出CSS 缩放导致条宽失真对比原图与打印稿改用原图尺寸打印偶尔扫得出偶尔不行留白不足或表面反光检查 margin 值margin 至少 10≥10x扫出来的内容多几个空格字符串未 trim打印前 console 看入参业务层做字符串清洗某些扫码枪支持度差编码格式不兼容换其他设备测试切换 CODE39 或 EAN 系列有一回我们做手持 PDA 页面安卓 WebView 里渲染 canvas 条码部分老机器扫不出来但是同一页面在电脑 Chrome 上扫得好好的。最后定位到是 PDA 屏幕分辨率太低浏览器把 canvas 做了 CSS 缩放视觉上看到的条码宽度只有真实像素宽度的一半。解决方案很简单把 canvas 的width属性改为2x像素CSS 里再用width: 50%显示相当于强制设置物理像素避免模糊。5.2 vue 2 和 vue 3 的兼容性差异JsBarcode 本身不是一个响应式库所以它跟 Vue 版本关系不大但在集成方式上有明显差异Vue 2可以用Vue.use(JsBarcode)注册为指令然后模板里用v-barcode这是官方文档主推的方式。Vue 3没有内置的use插件方法我推荐封装自定义指令或组件两种方式我都写过更推荐组件因为可以把下载方法一起封装进去。SSR 项目比如 Nuxt要特别注意JsBarcode 依赖document、window这些浏览器对象在服务端渲染时直接 import 会报错。解决办法是只在客户端组件里import或者用动态import包裹。如果项目用了 Nuxt我的习惯是加一个client-only组件包裹条形码模块或者在onMounted里动态 importonMounted(async () { const { default: JsBarcode } await import(jsbarcode) JsBarcode(canvasRef.value, props.value, { format: CODE128 }) })5.3 字符集问题与扩展字符处理Code128 本身分 A/B/C 三套字符集。JsBarcode 默认启用自动字符集切换绝大多数场景下效果都很好。但有一种特殊情况字符串里混合了大量小写字母和数字自动切换可能不是最优解导致条码比实际需要的更宽。你可以手工指定text前的格式比如JsBarcode(canvas, ABC123, { format: CODE128, text: ABC123 })其实更实用的做法是在传字符串之前先评估长度并动态决定 width。比如目标打印宽度是固定 40mm那我可以先渲染一版测量宽度再按比例反推 width实现自适应const autoFit (value, targetWidth) { const canvas document.createElement(canvas) JsBarcode(canvas, value, { format: CODE128, width: 2, margin: 10 }) const actualWidth canvas.width const ratio targetWidth / actualWidth return Math.max(0.5, 2 * ratio) }这个技巧我用在很多标签打印需求里能把条码宽度控制在固定范围内省去每次手工调参。5.4 控制台常见报错对照手册报错信息原因解决办法Cannot read property appendChild of null传入的 DOM 元素不存在检查 ref 是否绑定成功、onMounted 是否执行Invalid characters in the text字符串包含编码格式不支持的字符切换 CODE128 或做字符串清洗Invalid code lengthEAN 系列长度不符按 EAN-13 补 13 位、EAN-8 补 8 位element is not instanceof SVGElement渲染方式与元素类型不匹配canvas 元素配 canvas 渲染svg 元素配 svg 渲染JsBarcode is not a functionimport 方式错误确保 default 引入import JsBarcode from jsbarcode6. 打印适配与高清输出方案6.1 canvas 模糊问题的根源很多人在做标签打印时发现屏幕上好好的打印出来发虚或者锯齿明显。根源在于 canvas 的物理像素与CSS 像素存在分辨率比。浏览器里canvas的宽高属性width、height决定了画布的物理像素数量CSS 里的宽高只是显示尺寸。如果 canvas 物理像素是 300px但 CSS 里被放大到 600px浏览器会做插值缩放清晰度就会下降。打印同理打印机分辨率比屏幕高如果用显示尺寸去打印必然发虚。解决思路很简单让 canvas 的物理像素等于你需要的输出尺寸。比如要一张 600px 宽的条码图就把 canvas 的 width 设为 600而不是画 300 再 CSS 放大。JsBarcode 支持给width乘以一个倍数但更简单的方式是生成后做 canvas 尺寸归一化。const generateHiDPI (value, scaleFactor 2) { const canvas document.createElement(canvas) JsBarcode(canvas, value, { format: CODE128, width: 2 * scaleFactor, height: 80 * scaleFactor, margin: 10 * scaleFactor }) return canvas }然后把 canvas 按scaleFactor的倒数缩小显示打印时按原尺寸输出条码锐利不模糊。6.2 打印多张条码的拼版方式打印标签很少只打一张。常见需求是一页 A4 排 20 张每张包含条码文字logo。拼版方案我通常用 CSS Grid 或 Table 布局每个格子一个独立容器内部用 canvas 渲染条码文字部分用普通 DOM。生成完图片后调用window.print()打印整个区域。这里有三个重点打印样式要单独写用media print把所有与打印无关的按钮、导航隐藏掉。避免 canvas 被缩放打印样式里保证 canvas 的 CSS 尺寸等于像素尺寸或者用image-render-pixelated兜底。分页控制定期page-break-inside: avoid避免一个标签被切断到两页。还有一个小技巧打印前最好把条形码转成图片dataURL放进img标签因为部分浏览器的打印引擎对 canvas 元素的渲染不太稳定但对img兼容性更好。6.3 配合后端或原生扫码模块落地条形码不仅在 Web 端展示还经常要落到后端打印或原生 App 里。这种情况下前端生成条形码图片后通常要「导出为图片」或者「上传到服务器」。导出图片这段我们已经在组件里写了downloadBarcode上传的话只需把canvas.toBlob()放进 FormDatacanvas.toBlob((blob) { const formData new FormData() formData.append(barcode, blob, barcode.png) // 调用上传接口 }, image/png, 1)如果你用过 AutoJS 或其他自动化工具做快递条形码识别前端生成的条码图片格式只需保持规范第三方 OCR/扫码模块都能正常识别。关键还是条码本身的印刷质量。7. 我的一些实操体会做了这么多条形码相关需求最后分享几个反复被验证的经验。首先是永远不要把条码渲染当成一个纯前端展示问题。扫码枪读的是光学信号你的条码只要显示出来、打印出来就被拉进了物理世界。屏幕的像素密度、纸张的反光、打印机的墨量、标签纸的材质每一个环节都可能成为图上看着没问题拿枪一扫是空白的罪魁祸首。其次是组件化封装一定要坚持到底。条形码的渲染逻辑、字符串清洗、下载方法、打印适配就这么几件事写在哪都能用。但如果不封装好每个页面都复制一份 JsBarcode 调用代码后续一旦要统一调整宽度策略、增加校验规则你会陷入改了五个页面还有三个漏改的窘境。我这次提供的组件模板字段设计就是从这类真实项目里反推出来的。最后想说一个容易被忽略的思维习惯在真实业务里条码的样子永远没有规则重要。生成条码前和业务方确认清楚三件事什么字符允许进入条码条码下方是否需要同时显示人眼可读文本打印尺寸和扫码枪型号是什么。这三件事确认清楚了再写代码基本不会返工。我经历过最惨的一次教训是整套系统上线后客户说仓库那边的符号不支持 Code128要全部换成 Code39那时候全是前端实时渲染的条码改动虽然不大但重新测试花了整整一个下午。如果当初调研扫码枪时多问一句就能完全避免。条形码这种技术很基础但基础不等于简单。把字符串变成可识别的条码从编码规范到渲染时机到打印输出环环相扣。希望这份实操总结能帮你少走些弯路下次接到vue 字符串生成条形码这种需求时直接照这套方案落地就行。
返回列表