useWindowPrint 用于实现页面的打印,打印的效果相对来说比较好。useWindowPrint 支持 onBeforePrint、onBeforePrintContent、onAfterPrint 等回调,可以很方便地在不同阶段进行操作,如果觉得使用回调函数比较麻烦,useWindowPrint 也维护了一个 State,可以在打印时动态显示和隐藏页面上的元素。
useWindowPrint 也支持设置纸张四个方向的边距、页面的缩放比例(Chrome、IE支持,火狐不支持),可以使得打印的效果更为美观。
useWindowPrint 底层调用的是 window.print 方法,支持全部的浏览器,兼容性比较好。
GitHub地址: https://github.com/Jin0811/useWindowPrint 全部的代码和示例都在仓库当中。
react-to-print
onBeforePrint、onBeforeGetContent、onAfterPrint 等回调函数print-js
window.print
// 自定义HOOK
const [isPrint, beginPrint] = useWindowPrint({contentId: "PrintDemoId",margin: "5mm", // 打印的边距zoom: 1, // 打印时的缩放比例,仅支持chrome和IE,火狐不支持// 打印之前的回调,可以处理StateonBeforePrint: () => new Promise((resolve) => {resolve();}),// 打印DOM结构之前的回调,可以处理打印时DOM结构onBeforePrintContent: (pageDomClone, iframe) => new Promise((resolve) => {console.log(pageDomClone, iframe);resolve();}),// 打印完成之后的回调onAfterPrint: () => new Promise((resolve) => {resolve();}),
});// 打印
const handlePrint = () => {beginPrint();
};


beginPrint 方法,在此方法中更改 isPrint 为 trueuseEffect 当中监听 isPrint,为true时,则进行打印操作iframe,修改定位,使其不显示在页面上,指定其 onload 事件, onload 事件当中执行以下操作: DOM 结构:pageDomDOM 结构,得到复制过后的 DOM 结构:pageDomCloneiframe 的head标签当中,处理纸张边距和缩放比例DOM,添加到 iframe 当中window.print 之后,执行打印完成的回调iframe 添加到 document.body 当中useWindowPrint.js: src\hooks\useWindowPrint.jsPrintDemo.jsx: src\views\PrintDemo.jsxprintStyle: public\printStyle