useWindowPrint 自定义的打印HOOK

news2024/12/25 23:57:00

useWindowPrint 自定义的打印HOOK

1 介绍

useWindowPrint 用于实现页面的打印,打印的效果相对来说比较好。useWindowPrint 支持 onBeforePrintonBeforePrintContentonAfterPrint 等回调,可以很方便地在不同阶段进行操作,如果觉得使用回调函数比较麻烦,useWindowPrint 也维护了一个 State,可以在打印时动态显示和隐藏页面上的元素。

useWindowPrint 也支持设置纸张四个方向的边距、页面的缩放比例(Chrome、IE支持,火狐不支持),可以使得打印的效果更为美观。

useWindowPrint 底层调用的是 window.print 方法,支持全部的浏览器,兼容性比较好。

GitHub地址: https://github.com/Jin0811/useWindowPrint 全部的代码和示例都在仓库当中。

2 打印的相关技术选型

  • react-to-print

    • 是一个用于React项目当中的第三方打印库
    • 优点:
      • 支持 onBeforePrintonBeforeGetContentonAfterPrint 等回调函数
      • 样式的支持度比较好,打印出来样式的还原度比较高
    • 遇到的问题:
      • 偶发性问题,内容很长导致了换页时,文字有可能会被截断,一个字和上下在两张纸上面
      • 偶发性问题,打印时,Antd的表头出现了多个,导致了与表格内容重叠,不太清楚是不是项目当中其他的样式影响,导致了双表头重叠
      • 项目当中的某个机器上不支持,兼容性可以根据自身项目的实际情况进行考虑
  • print-js

    • 是一个PC端的打印库,各种框架都是支持的
    • 优点:
      • 支持打印HTML元素、图片、JSON数据等
    • 遇到的问题:
      • 没有相关的打印回调
      • 样式支持度不高,复杂页面、复杂布局的打印效果不理想
  • window.print

    • 是JavaScript原生自带的浏览器方法
    • 优点:
      • 支持全部的浏览器,兼容性比较好
      • 自由度比较高,可以根据自己的需求进行封装
      • 样式可以自定义,效果相对来说比较理想
    • 遇到的问题:
      • 直接调用时,只能打印当前可视窗口内的内容,无法打印完全(通过iframe的方式解决了此问题)

3 useWindowPrint 使用示例

// 自定义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();
};

4 useWindowPrint 打印效果预览

在这里插入图片描述
在这里插入图片描述

5 useWindowPrint 主要封装思想

  • 点击打印按钮,调用 beginPrint 方法,在此方法中更改 isPrinttrue
  • useEffect 当中监听 isPrint,为true时,则进行打印操作
  • 创建一个 iframe,修改定位,使其不显示在页面上,指定其 onload 事件, onload 事件当中执行以下操作:
    • 根据传递进来的id,获取页面上的 DOM 结构:pageDom
    • 复制此 DOM 结构,得到复制过后的 DOM 结构:pageDomClone
    • 将Antd样式文件、公共打印样式文件添加到 iframe 的head标签当中,处理纸张边距和缩放比例
    • 处理部分Antd组件打印异常的问题
    • 将处理完成的 DOM,添加到 iframe 当中
    • 延时调用打印,防止样式不生效
    • 调用完 window.print 之后,执行打印完成的回调
  • iframe 添加到 document.body 当中

6 useWindowPrint 源码和示例代码

  • useWindowPrint.js: src\hooks\useWindowPrint.js
  • PrintDemo.jsx: src\views\PrintDemo.jsx
  • printStyle: public\printStyle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于PHP+MySQL蛋糕甜点销售网站的设计与开发

现如今先进科学技术高速发展,计算机技术已经被社会的各个领域广泛应用。随着计算机技术和通信技术的迅猛发展,互联网的规模也逐步增大,互联网的元素也随之逐渐增加,可以利用其发展通信,也可以利用其进行商业用途&#…

scratch小老鼠偷面包 电子学会图形化编程scratch等级考试二级真题和答案解析2022年9月

目录 scratch小老鼠偷面包 一、题目要求 1、准备工作 2、功能实现 二、案例分析 <

Vue Class与Style绑定

Vue Class与Style绑定1 Class绑定1.1 字符串写法1.2 数组写法1.3 对象写法2 Style绑定2.1 对象写法2.2 数组写法1 Class绑定 在Vue中&#xff0c;如果要为某个元素动态添加某个类&#xff0c;并不会使用document.getElementById等选择器将该元素获得&#xff0c;而是使用v-bin…

Tomcat突然停止运行/Server Tomcat v8.5 Server at localhost fail

Server Tomcat v8.5 Server at localhost failed to start./org.apache.catalina.startup.Catalina start 严重: 所必需的服务组件启动失败&#xff0c;所以无法启动Tomcat 1.使用eclipse写系统时突然无法运行jsp文件 2.查看任务管理器&#xff0c;将其启动&#xff0c;依旧不…

101-115-hive-优化执行计划表优化

101-压缩存储-优化&#xff1a; 执行计划&#xff08;Explain&#xff09; 1&#xff09;基本语法 EXPLAIN [EXTENDED | DEPENDENCY | AUTHORIZATION] query &#xff08;2&#xff09;查看详细执行计划 hive (default)> explain extended select * from emp; hive (de…

OpenGL 图像绿幕抠图

目录 一.OpenGL 图像绿幕抠图 1.IOS Object-C 版本1.Windows OpenGL ES 版本2.Windows OpenGL 版本 二.OpenGL 图像绿幕抠图 GLSL Shader三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL E…

Linux 内核(Kernel)组成分析

【好文推荐】 需要多久才能看完linux内核源码&#xff1f; 浅析linux内核网络协议栈--linux bridge 深入理解SR-IOV和IO虚拟化 一文了解Linux上TCP的几个内核参数调优 概述Linux内核驱动之GPIO子系统API接口 一、Linux内核简介 Linux 内核采用宏内核架构&#xff0c;即 Linux …

Springboot利用Security做OAuth2授权验证

OAuth2获取授权令牌&#xff08;token&#xff09;通常有四种方式&#xff1a;授权码模式&#xff0c;简化模式&#xff0c;客户端模式&#xff0c;和密码模式。针对自己系统内用户的登录&#xff0c;通常使用密码模式进行授权。 我们利用Spring Security OAuth2来制作一个授权…

[附源码]Python计算机毕业设计Django健身生活系统论文

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【Java】从源码分析fail-fast和fail-safe是如何产生的

文章目录fail-fastfail-safe这个问题出现在使用Iterator迭代器的时候。如果某一个集合在使用的时候&#xff0c;另一个线程修改了这个集合&#xff0c;会出现什么情况呢&#xff1f;因此就出现了两种解决策略fail-fast 一旦发现遍历的同时其它人来修改&#xff0c;则立刻抛异常…

【微信小程序】页面跳转、组件自定义、获取页面参数值

&#x1f3c6;今日学习目标&#xff1a;第十七期——页面跳转、组件自定义、获取页面参数值 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;25分钟 &#x1f389;专栏系列&#xff1a;我的第一个微信小程序 文章目…

推荐系统相关论文阅读整理

文章题目 基于协同过滤的微信点餐推荐系统的设计与实现 作者 张彭飞 吉林大学 期刊论文在线阅读—中国知网 (cnki.net)摘要关键词协同过滤;推荐系统;Docker;PXC;RedisCluster;名词解释文献研究目的推荐系统应用现状 在1990 年代&#xff0c;为了解决邮件过载问题&#xff0c…

如此简单的k8s,快速玩转ingress

如此简单的k8s&#xff0c;快速玩转ingress NodePort 可以实现的功能和缺陷&#xff1a; 功能、在每一个节点上面都会启动一个端口&#xff0c;在访问的时候通过任何的节点&#xff0c;通过节点加ip的形式实现访问 缺点、也就是说每个端口只能使用一次&#xff0c;一个端口对应…

传输层协议 —— TCP(图解1)

目录 一、TCP的基本认识 1. TCP头部格式 2. TCP协议的特点 3. 什么是TCP连接 4. TCP如何封装与分用 二、通过序列号和确认应答号提高可靠性 1. 32位序列号 2. 32位确认应答号 3. 保证可靠性 4. 为什么序列号和确认应答号是单独的字段 三、窗口大小 1. TCP的发送和…

[附源码]JAVA毕业设计敬老院管理系统(系统+LW)

[附源码]JAVA毕业设计敬老院管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&a…

ubuntu 实现远程开关机

1. 需求 家里厅里有三台linux主机在跑虚拟机, 一台windows主机在跑wsl2 - ubuntu 20.04 分别是 硬件网络连接方式OSip虚拟机sEUC i5 7250U 16Gwifiwin1010.0.1.223wsl2 - 随机ipMineFine S500 R7 5800H 64G网线Zorin OS 16.2 (Ubuntu 20.04 LTS)10.0.1.198vm1 - 10.0.1.156 …

统计信号处理基础 习题解答6-14

题目&#xff1a; 噪声过程由IID零均值&#xff0c;PDF为 的随机变量组成&#xff0c;其中0<ε<1 。这样的PDF成为高斯混合PDF&#xff0c;它用来模拟 具有方差为 的高斯噪声以及剩余的服从方差 的高斯噪声。一般 &#xff0c;且ε≪1 &#xff0c;所以具有方差为 的背…

[Java安全]—Tomcat反序列化注入回显内存马

前言 在之前学的tomcat filter、listener、servlet等内存马中&#xff0c;其实并不算真正意义上的内存马&#xff0c;因为Web服务器在编译jsp文件时生成了对应的class文件&#xff0c;因此进行了文件落地。 所以本篇主要是针对于反序列化进行内存马注入来达到无文件落地的目的…

[附源码]计算机毕业设计JAVA学生信息管理系统

[附源码]计算机毕业设计JAVA学生信息管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

交流转直流LED驱动芯片 MT7930 SOP8

隔离LED驱动ic芯片 MT7930 SOP8 交流转直流LED驱动芯片 MT7930的描述&#xff1a; MT7930是一个单级、高功率因数&#xff0c;源边控制交流转直流LED驱动芯片。只需极少的外围器件感应源边的电学信息&#xff0c;就可以精确地调制LED电流&#xff0c;而不需要光耦及副边感应器件…