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