ARTICLE DETAIL

资讯详情

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

基于hiprint的Vue可视化打印设计器完整实践指南

基于hiprint的Vue可视化打印设计器完整实践指南 简介这是一套专为Vue开发者打造的高性能打印解决方案面向Web应用开发中需实现报表生成、票据打印、可视化设计等场景的中高级前端工程师。资源提供hiprint在Vue2与Vue3双版本下的完整集成能力覆盖打印配置、拖拽式设计器、动态元素编辑、多模板报表布局及所见即所得的打印预览全流程显著降低复杂文档输出的开发门槛。压缩包共77个文件含26个核心JS逻辑文件、12个Vue组件、15个PNG/SVG图标资源、4个CSS样式文件及字体、HTML入口等结构清晰开箱即用整体体积仅3.8MB轻量且无冗余依赖。已有5137人学习下载资源包含可直接运行的demo示例、多套预设打印模板template1–3.png、微信/支付宝等常用图标素材、Webpack构建配置及详细LICENSE说明便于快速集成、二次开发与生产部署。 做前端时间长了总会遇到页面打印、报表导出的需求。普通按钮window.print()只能把整个页面打出来要控制打印区域、设计单据、调报表布局就得找专门的方案。hiprint for Vue2/Vue3是我在多个项目里用了很久的一套前端打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑方案它自带可视化设计器能拖拽生成打印模板最终在浏览器端直接出 PDF 或走系统打印机。这篇文章就把我实际接入和使用中的经验完整梳理一遍包括设计器、元素编辑、数据绑定、合并单元格、批量打印这些关键点适合正在做 Vue 打印功能或者想从零搭建一个打印设计模块的开发者参考。1. 为什么是 hiprint可视化打印设计器的选择逻辑1.1 传统 web 打印方案的痛点在刚开始接打印需求时我第一反应是用 CSSmedia print加一个隐藏打印区域配合window.print()输出。这个方案写起来快但真正做项目后会发现一个问题业务方几乎每次都要微调。今天要在左上角加一行客户名称明天要改表格列宽后天要把整个单据换成一联纸。每次调整都得改样式、调间距、重新提测来回折腾几次前端自己就先烦了。还有一个非常突出的痛点分页不可控。多行明细表在打印时会从中间切断页眉页脚要么没有要么每一页都一样。虽然可以用 CSSpage-break-inside: avoid之类的属性去优化但不同浏览器表现还不一致实际效果完全看运气。更别提页边距、纸张大小、缩放比例这些参数很多浏览器根本不支持通过 CSS 精确设置只能靠用户在打印对话框里手动调业务方一般调不明白。后来我也试过jsPDF配合html2canvas把页面截成图片再导出 PDF。这种方式能把界面原样复制下来但有两个致命问题一是图片打印出来的文字是位图放大后发虚还无法选中检索二是一旦表格内容多渲染时间会翻倍增长页面会卡好几秒。对高频打印场景来说这个体验是接受不了的。还有一类方案是后端生成 PDF 或 Excel 模板。后端生成的问题是开发周期长每次改动字段、调整布局都要前后端一起排期。尤其现在的业务系统改动很频繁一个报表的字段可能一周变三次后端模板改起来非常痛苦。所以站在交付效率的角度前端需要一个“可视化的、可以保存模板、运行时动态填充数据”的打印方案hiprint正好符合这个定位。1.2 hiprint 的核心设计思路模板化 可视化hiprint的设计思路说白了就是“把打印内容抽象成一份 JSON 模板”。模板里定义了纸张大小、面板位置、每个元素放在哪个坐标、字体多大、颜色什么等等。运行时再拿真实数据去渲染这份模板生成一段独立的打印 HTML最后调用浏览器的打印能力输出。这个过程把“设计”和“数据”剥离开了。设计器是给业务人员或者前端配置模板用的他们拖拽元素、调属性最终产出一个 JSON开发者只需要把这份 JSON 存到后端页面加载时再拿出来传给打印组件去渲染。以后业务说“这里加一行”不需要改代码直接打开设计器改完保存模板就可以了。这两步分离之后需求响应速度会快很多。这个思想很容易让人联想到低代码平台。打印模块本质上也像一个小的低代码设计器它要处理的是元素编辑、面板布局、数据绑定、属性配置恰好也是可视化设计器最擅长的领域。如果团队里有非技术同学需要维护打印样式hiprint的设计器能直接给他们用开发只需要保证数据字段齐全。1.3 适用场景与选型建议在选型之前先要判断自己的场景适不适合hiprint。我建议重点看这几类订单、送货单、发票、销售单据需要精确排版和多份连续打印。物流面单、条形码、二维码标签需要动态生成条码并批量打印。数据报表、统计表格需要按字段渲染列表和明细。医疗报告、检测报告、证书类输出模板固定但数据逐条变化。内嵌到管理后台的打印设计器需要让运营人员自己维护打印样式。如果只是偶尔打印一个页面段落不需要精细化控制用浏览器自带的打印功能就够了。但如果业务方对纸张、分页、样式有明确要求且模板会频繁调整hiprint这类可视化设计器就是更合适的答案。这里放一个简单的方案对比都是我实际接触过的方案可视化设计数据绑定批量打印输出质量维护成本CSS media print无手动弱一般中jsPDF html2canvas无手动弱一般文字发虚高后端 PDF/Excel 模板无后端维护强高高hiprint有前端字段映射强较高依赖浏览器低选定hiprint之后接下来最关心的就是怎么在 Vue2/Vue3 项目里把它跑起来。2. 项目接入Vue2 / Vue3 里的完整初始化2.1 安装与依赖澄清hiprint的 npm 包一般用vue-plugin-hiprint来安装。这个包内部封装了设计器和打印组件同时保留了核心 API 的导出。项目里通常还会用到 jQuery因为hiprint的底层操作依赖 jQuery 的 DOM 处理能力所以安装完之后建议把jquery也显式声明为项目依赖避免某些环境下找不到全局$。命令很简单npm install vue-plugin-hiprint jquery --save安装完成后需要把样式文件引进来。我用的是vue-plugin-hiprint/dist/print-lock.css这个文件负责打印时的样式锁定不引入的话容易出现页面样式被打印样式干扰的情况。可以在入口文件里直接导入也可以在用到打印组件的页面单独导入。在正式开始之前还有一个隐藏知识点hiprint真正运行的时候会创建一个隐藏的iframe把打印内容和样式放进这个iframe里再调用iframe里的打印函数。这样做的好处是打印内容与主页面完全隔离不会被业务页面的 CSS 污染坏处是初始化必须等iframe加载完所以第一次执行打印时要留一点缓冲时间后面我会在踩坑部分详细说。2.2 在 Vue2 中的全局注册Vue2 项目接入比较直接在入口文件main.js里注册插件即可import Vue from vue import vuePluginHiprint from vue-plugin-hiprint import vue-plugin-hiprint/dist/print-lock.css Vue.use(vuePluginHiprint)注册之后全局组件就能直接用了。主要的组件包括hiprint-print-template等你可以把模板 JSON 通过 props 传给组件它在内部完成渲染。不过我自己的习惯是不太依赖全局组件而是直接用hiprint的核心 API 写一个工具函数这样在弹窗、非组件环境、甚至原生 JS 文件里都能用。全局注册更适合业务简单、不想封装太多逻辑的团队。需要注意 Vue2 的响应式系统会把对象重写 getter/setter而hiprint内部维护了大量原生对象如果把模板对象放在data里Vue 会做深度响应式处理有时候会导致hiprint在修改内部状态时被 Vue 的 observe 拦截出现莫名其妙的卡顿或属性丢失。我的做法是把模板 JSON 放到data中用于 UI 展示但在真正构造PrintTemplate实例之前用JSON.parse(JSON.stringify(template))做一次深拷贝切断响应式链接。2.3 在 Vue3 中的全局注册与差异Vue3 的用法和 Vue2 很像只是插件注册方式换成了app.useimport { createApp } from vue import App from ./App.vue import vuePluginHiprint from vue-plugin-hiprint import vue-plugin-hiprint/dist/print-lock.css const app createApp(App) app.use(vuePluginHiprint) app.mount(#app)Vue3 下我遇到过几个差异点。第一组合式 API 里如果用reactive包裹模板对象同样要注意响应式代理的问题。toRaw并不能完全解决所有场景最稳妥的方式还是先把模板 JSON 序列化一次再喂给hiprint。第二vue-plugin-hiprint里面的打印组件是基于选项式 API 写的在 Vue3 中依然可以正常运行因为 Vue3 兼容选项式 API。但如果你的项目使用script setup语法那建议还是走核心 API 更顺手组件返回的实例也能直接在模板里用。第三Vue3 的生态移除了一些全局方法如果你用到Vue.prototype.$hiprint这类挂载方式需要改成app.config.globalProperties.$hiprint hiprint。我后来封装打印工具时直接导出一个单例对象彻底避免了到处挂全局的麻烦。2.4 引入设计器与打印组件的核心概念在写业务之前先理解hiprint的三个核心实例hiprint.init()初始化底层打印容器项目启动时调用一次。new hiprint.PrintTemplate(options)接收模板 JSON 和其他配置生成一个打印模板实例。这个实例负责把模板渲染成 HTML并且可以调用打印。设计器实例由PrintTemplate挂载到可视化面板后生成用来拖拽元素、编辑属性。导出时会把当前画布内容生成新的 JSON。这三个概念弄清楚了后面无论怎么封装都不会迷路。实际项目中我一般只在需要展示设计器的页面创建设计器实例其他只需要打印数据的页面直接创建PrintTemplate实例。这样能省去大量 DOM 渲染开销尤其在后台管理系统里打印页面往往有几十个入口没必要为了一个打印按钮把整个设计器加载进来。3. 可视化设计器深度拆解元素编辑背后的数据逻辑3.1 画布、纸张与模板结构打开设计器之后第一眼看到的是一个白底画布这是模拟纸张的区域。纸张大小在右侧属性面板里设置常见的有 A4、A5、快递面单、自定义尺寸等。这里有一个容易踩坑的地方设计器里展示的尺寸单位通常直接用毫米而浏览器渲染时最终会换算成像素。换算关系一般是1mm 96 / 25.4 px也就是差不多 3.78 像素。所以设计器里一个100mm宽的文本框在屏幕上的实际像素大概是378px。如果你在设计器里看到的元素位置和最终打印结果有细微偏差多半是因为缩放预览模式或显示比例不同真正打印时是以模板里的毫米数值为准的。一个模板 JSON 的大致结构如下{ settings: { paperWidth: 210, paperHeight: 297, paperType: A4, orientation: portrait, pageNum: 1 }, panels: [ { width: 210, height: 297, elements: [ { type: text, left: 10, top: 10, width: 80, height: 10, options: { field: title, fontSize: 14, fontWeight: bold, textAlign: center } } ] } ] }settings控制纸张属性panels是画布列表大多数情况只有一个面板elements就是上面放的所有元素。每个元素通过type区分类型通过left/top/width/height确定坐标和尺寸通过options配置样式和数据字段。理解了这个结构后面导出模板、保存到后端、动态改字段都会非常顺畅。3.2 元素类型与属性面板从文本到二维码设计器的核心能力在左侧元素面板里面提供了很多可拖拽的元素类型文本用于显示标题、字段值、静态说明文字。条形码可以绑定一个字符串字段自动生成 Code128 等格式条码。二维码绑定文本内容后自动生成二维码。表格用于展示明细列表数据是财务报表和订单打印里最重要的元素。图片可以放固定 Logo也可以绑定图片 URL 字段动态切换。矩形常用于边框、分隔线、底色块。直纹用于画水平线、垂直线实现表格线或分隔区。把元素拖到画布上之后右侧属性面板会出现对应类型的配置项。比如文本元素可以设置字体、字号、加粗、对齐、行高、字符间距等条形码可以选择码制、是否显示人类可读文本、条码宽度等。这里最容易忽略的是“字段绑定”属性字段名要和数据源里的 key 完全一致否则打印时会显示为空。我习惯在模板设计阶段就对所有字段做个整理统一命名规范比如订单号用orderNo客户名称用customerName避免有人用英文、有人用中文最后数据对不上。属性面板里还有一个“事件/格式化”配置可以给某个字段写自定义处理函数。比如日期存的是时间戳打印时要显示成2025-06-01 12:30就可以在这里写一段格式化逻辑。这个功能非常实用因为它把数据呈现细节从组件代码里抽离到了模板定义里业务方改格式不用发版。3.3 数据源绑定与动态数据填充设计器纯粹是设计时工具真正要让模板“活”起来需要在代码里传入数据。PrintTemplate实例提供了渲染方法常见用法如下const printTemplate new hiprint.PrintTemplate({ template: templateJson }) const data { title: 销售对账单, orderNo: SO-2025-0601-001, customerName: 某某科技有限公司, items: [ { name: 商品A, quantity: 2, price: 19.9 }, { name: 商品B, quantity: 1, price: 99 } ] } printTemplate.print(data)调用print时hiprint会遍历模板里的元素把每个元素options.field对应的属性从data里取出来填进去。如果找不到对应的字段它不会报错而是渲染成空字符串所以线上容易出现“某个位置空白”的问题原因往往就是前端字段名和后端返回的 key 没对齐。除了print之外还有一个getHtml方法它做的事情和print一样但不打开打印对话框而是返回拼接好的 HTML 字符串。这个 API 在批量打印和自定义预览时非常有用后面我会重点讲。数据绑定还有一点需要注意如果元素上设置了静态值options.value并且没有绑定字段渲染时会直接使用这个静态值如果同时设置了field和value一般会优先取field对应的动态数据。了解了这个规则在调试模板的时候就能快速判断是数据问题还是模板配置问题。3.4 表格设计合并单元格、列宽控制与明细表表格是打印报表里最复杂的部分也是最容易出问题的部分。先说明细表。设计器里放一个表格元素在属性里配置表格列数然后拖动列宽、设置每列标题。表格数据绑定不是把整个数组塞到一个字段里而是需要单独指定“列表字段”。比如上面data里的items数组表格元素里会有一个配置项是“数据源字段”或listField把它填成items渲染时表格就会遍历items的每条记录生成一行。列宽控制上设计器里可以直接拖动表格列边缘调整也可以直接输入固定像素值。但注意表格宽度总和如果超过了面板宽度打印出来就会溢出到下一页这会直接导致纸张浪费。我的习惯是“先确定面板宽度再倒推各列宽度”保证总和有小余量而不是随便拖到满意为止。关于热搜里常出现的hiprint合并某一列所有单元格其实有几种不同需求如果希望整个表格某一行跨所有列可以用“合并行”或“跨列单元格”功能。如果希望表格里某一列的所有单元格合并成一个大单元格一般通过“单元格合并”或“按列分组”实现。如果希望相同值的多行自动合并需要用“分组合并”功能设置按某字段分组后相邻相同值的单元格会自动合并。我实际用下来最稳妥的方法是把表格拆成“左侧主表”和“右侧附属表”两个表格元素用绝对定位拼在一起。比如商品信息占左半部分右侧则是一列合计说明这样看似是两个表但打印效果像一张表。这种方法虽然配置起来多一步但不会受到合并计算边界条件的影响跨页表现也更稳定。如果业务上确实要用单表内合并我建议一定要做小数据集验证。比如只有 1 行、2 行、很多行时分别打印一次检查边界条件是否正常。因为合并计算在大数据量下很容易出现行高异常或跨页断行提前排查比事后补救效率高得多。4. 从设计到打印一套可落地的完整实现4.1 最小可运行示例设计器 打印按钮现在我把一个最常用的流程完整写一遍页面左侧放一个设计器业务人员调整模板然后点击“打印预览”按钮用当前数据生成打印内容。这里为了减少对外部组件封装的依赖我直接用核心 API 操作。template div div idhiprint-design-panel/div button clickprint打印/button button clickgetTemplate拿到当前模板/button /div /template script import { hiprint } from vue-plugin-hiprint import vue-plugin-hiprint/dist/print-lock.css export default { name: PrintDesignPage, data() { return { designer: null, printTemplate: null, currentTemplateJson: null, printData: { title: 测试单据, orderNo: A-0001, items: [ { name: 商品A, quantity: 2 }, { name: 商品B, quantity: 1 } ] } } }, mounted() { hiprint.init() // 初始模板可以是从后端加载的 JSON const defaultTemplate { settings: { paperWidth: 210, paperHeight: 297, paperType: A4 }, panels: [ { width: 210, height: 297, elements: [ { type: text, left: 10, top: 10, width: 100, height: 12, options: { field: title, fontSize: 18, fontWeight: bold } } ] } ] } this.currentTemplateJson defaultTemplate // 创建设计器 this.designer new hiprint.PrintTemplate({ template: defaultTemplate }) this.designer.design(#hiprint-design-panel) // 创建打印实例也可以沿用同一个实例 this.printTemplate new hiprint.PrintTemplate({ template: defaultTemplate }) }, methods: { print() { if (!this.printTemplate) return this.printTemplate.print(this.printData) }, getTemplate() { // 取出设计器里最新的模板 JSON this.currentTemplateJson this.designer.getJson() console.log(this.currentTemplateJson) } } } /scriptnew hiprint.PrintTemplate()创建一个模板实例后调用design(#hiprint-design-panel)会把设计器渲染到指定 div 中。getJson()用于提取当前设计器里所有元素和配置返回可用于持久化的对象。打印时再用新的或旧的模板实例执行print(data)就能直接弹起浏览器打印对话框。这里有一个容易困惑的点为什么要同时创建designer和printTemplate两个实例其实设计器实例内部也具备渲染和打印能力但在我的项目里设计器页面通常比较重包含了很多辅助面板将打印实例单独拆出来可以保证打印操作不依赖设计器 DOM。如果场景简单也可以直接复用设计器实例只是要注意它内部会持有大量 DOM 引用关闭页面时最好手动销毁。4.2 模板持久化JSON 的导入导出设计器的最终产出就是一份 JSON。保存模板时我通常会先判断一下模板是否合法再走接口存到后端。const templateJson this.designer.getJson() // 校验基本结构 if (!templateJson || !templateJson.panels || !templateJson.panels.length) { this.$message.warning(模板内容为空) return } // 转成字符串后保存 localStorage.setItem(printTemplate, JSON.stringify(templateJson))加载模板时反过来从后端拿到字符串解析成对象后传给PrintTemplate。这里强烈建议做一次JSON.parse(JSON.stringify(...))深拷贝原因之前说过就是在新模板实例化和旧实例交替使用时避免对象引用互相污染。有一次我在线上排查到部分客户打印模板错乱最后定位到就是同一个模板对象被多个实例共享某个实例修改了元素宽高其他实例跟着变。每次业务方调整模板最好在接口里保留一个“版本号”字段。因为打印模板更新后历史单据需要按当时的模板重新打印没有版本号就很难追溯。这个设计在票据、合同、报告类项目里非常关键看着多存一个字段实际上省了很多售后问题。4.3 批量打印、长图打印与 PDF 输出批量打印是我在业务系统里遇到的最常见需求。比如财务月末要打印一百张对账单后台导出一堆数据前端逐条循环弹打印对话框显然不现实。hiprint的print方法支持传入一个数据集用起来就像这样const printList monthList.map((item) { return { title: 对账单, orderNo: item.orderNo, customerName: item.customerName, items: item.goodsList } }) printTemplate.print(printList)传入数组后它会在打印内容中连续渲染多份模板并根据settings里的分页配置自动分页。大多数情况下这比循环调用更快也更稳定。如果你需要的不是系统打印机输出而是先预览成一个长图或 PDF 文件我的做法是先用getHtml(data)拿到完整 HTML然后放到一个隐藏的容器里再通过自己封装打印预览弹窗把这段 HTML 展示出来。用户在预览弹窗里可以直接用浏览器“另存为 PDF”这样就实现了不依赖第三方打印控件的 PDF 输出。长图打印的逻辑稍微特殊。普通 A4 纸张是固定高度但标签、长报表需要把纸张高度设成内容实际高度。在模板settings里把paperHeight改成足够大的值同时在打印时机设置边距为 0就能输出一张连续长图。如果涉及多条记录拼在一张长图上也可以用getHtml把多份 HTML 拼接后统一渲染再交给打印预览。4.4 常见打印参数纸张、方向、边距、缩放hiprint的打印效果和浏览器打印参数是强相关的几个关键参数我整理成了表格方便你对照排查参数位置作用建议纸张类型模板 settings决定输出纸型优先使用 A4、A5 标准纸型纸张宽度/高度模板 settings自定义纸张大小标签纸、联单使用打印方向模板 settings横向或纵向根据报表宽度选择边距打印对话框 / page CSS控制内容距纸张边缘默认 5mm-10mm缩放比例打印对话框缩小或放大打印内容默认 100%如有截断可尝试缩小背景图形打印对话框是否打印背景色和背景图默认不打印需要时手动开这些参数中边距和缩放是“打印错位”的高发区。我通常会在模板options初始化里给打印容器加一点基础 CSS比如page { margin: 5mm; }减少用户在打印对话框手动调整的频率。如果用户反馈打印位置偏右或偏下第一反应不是改模板坐标而是先确认浏览器打印预览里的边距和缩放值通常调整这两个值就能解决大部分问题。5. 踩坑笔记与问题排查5.1 打印定位偏移、内容被截断打印错位是反馈最多的一个问题。我遇到的情况大概有三类内容整体往右下偏移往往是浏览器打印边距和模板边距叠加导致的。解决方法是把打印边距设为“默认”或“无”同时在模板面板里保留适当边距。内容左右居中但上下偏了很多。这在自定义纸张高度时比较常见因为部分浏览器对自定义高度支持不完整建议先检查paperHeight是否过小或过大。内容第一行被切掉半行。这类问题通常是打印驱动或缩放百分比导致把缩放设为 “适合页面” 或 100% 再试。另外hiprint的打印内容是在隐藏iframe中触发的如果刚初始化完就立刻点击打印可能会出现白页。可以在页面mounted里先调用一次hiprint.init()并给实际打印按钮一个最小延迟比如setTimeout(() printTemplate.print(data), 200)。虽然不是什么高级技巧但实测下来能解决很多偶发性的空白打印。5.2 合并单元格与 rowspan/colspan 的坑表格合并单元格是打印设计中最容易让新手挠头的部分。用设计器自带合并功能时要注意它生成的是一整块“合并区域”渲染时数据填充顺序可能和你想象的不一样。比如你想在明细表右侧合并一列用来放“备注”字段但原数据数组里每个子项都带remark直接合并会造成多条相同备注重复显示。我的做法是先在数据层把需要展示的聚合值算好再用一个普通文本元素去绑定它而不是依赖表格单元格合并。这样逻辑更透明跨页时也不会因为合并计算产生奇怪的分页。如果你确实需要同一列中多个相同值合并成一个单元格注意“相邻相同值”的含义。排序混乱会导致合并不生效所以数据在排序时要保证相同项相邻。我在订单打印场景里就遇到类似问题客户要求同一收货人的多个订单合并成一格但订单按订单号排序相同收货人没有连续排列合并出来的效果完全不对。调整排序字段后问题立刻消失。5.3 不同浏览器、不同电脑打印结果不一致大部分业务系统都在 Windows Chrome 下运行但依然会遇到 Firefox、Edge、Mac 下的打印差异。Firefox 对page size的支持并不完整自定义纸张高度经常被忽略所以如果你需要打印长图或特殊尺寸标签建议明确要求用户使用 Chrome 或 Edge。Mac 上的 Chrome 打印对话框显示逻辑和 Windows 有细微差别边距默认值也不同最好做一次跨平台验证。不同电脑打印不一致最常见的原因不是代码而是打印驱动和纸张设置。比如同一台打印机在 A 电脑上设置了默认 A4在 B 电脑上默认 Letter打印结果自然不一样。这种问题靠前端无法根除但可以在模板里显式声明paperType: A4并在打印预览界面提醒用户检查纸张类型能减少一部分反馈。5.4 与前端框架冲突及性能优化hiprint内部依赖 jQuery而在 Vue3 项目中很多依赖库已经不再关注 jQuery两者同时存在不算冲突但要注意全局变量污染。如果项目用到 CSP 安全策略可能会限制iframe或内联样式导致打印样式失效需要适当配置白名单。大数据量表格渲染时getHtml方法会把整个数据集拼进一串 HTML 字符串如果表格有几千行页面可能卡顿几秒。我采取的策略是“分批渲染、合并输出”把大数据切分成几组分别调用getHtml再用字符串拼接成一个完整 HTML最后一次性打印。这样比直接渲染一个超大table更快一点而且打印预览也不会被浏览器内存拖垮。如果你需要频繁切换模板建议维护一个模板实例池而不是每次new一个新的PrintTemplate。因为实例化过程会做一堆 DOM 初始化和样式注入频繁创建和销毁会带来不必要的性能损耗。我在项目中通常用一个 Map 缓存模板 ID 对应的实例打印时直接取实例确定不再使用后再删除。最后再分享一个我自己的小技巧在设计器模板里尽量把所有字段名的命名统一用小驼峰后端返回的数据在打印前用一层map做字段对齐。这样即使后端字段临时变了英文首字母大写前端打印工具层也能兜底转换不会让业务人员去模板里逐一修改字段映射。打印这个功能看起来简单真正做得省心靠的都是这些不起眼的约定和细致的排查习惯。本文还有配套的精品资源点击获取
返回列表