当前位置: 首页 > news >正文

【react】动态页面转换成html文件下载,解决样式问题

需求

今天遇到一个需求,挺恶心人的,将一个在线文档页面,可以导出成为html页面查看。

看到网上有使用fs模块,通过react的ReactDOMServer.renderToStaticMarkup将组件转成html字符串,输出文件了。
但是我尝试了,发现引入的fs为空,我就愁思,这个node环境下的模块,在react项目中能用么,一想到这里,自己真的是太笨了,肯定的不适用啊。fs是node模块,除非是next.js,不然用不了。

解决

思路类似,获取页面上渲染完成的dom字符串,通过a标签下载

URL.createObjectURL(file)

const fileName = `${name}.html`;const file = new File([htmlWithStyles], fileName, { type: 'text/html' });const oUrl = URL.createObjectURL(file);const a = document.createElement('a');a.style.setProperty('display', 'none');a.href = oUrl;a.download = file.name;document.body.appendChild(a);a.click();a.remove();const delay = 10000;setTimeout(() => URL.revokeObjectURL(oUrl), delay);

但是问题来了,发现下载的文件样式不存在 需要引入外部样式或者在写在style标签中

  const htmlWithStyles = `<html><head><style>${styles}</style></head><body><div style="display:flex; height: 100%;">${html}</div></body></html>
`;

笨人方法只有这样了,再高级点的,俺也不会

代码

这里的styles是外部定义的
要跟下载后的html里面的classname要对应,毕竟react项目跑起来的样式是加了很多前缀,比如这样
在这里插入图片描述
还有一个问题,就是使用的antd的表格,样式实在是太多了,但是还是要copy进去,不然静态页面样式就缺失了,从原本的页面里面,index.less进去,把所有的跟table相关的样式都copy过来。
在这里插入图片描述
在这里插入图片描述
所以说这个需求感觉没啥难度,但是又挺麻烦的。

封装方法

export function downHtmlFile({ html, name }) {// 创建包含外部样式链接的 HTML 字符串const htmlWithStyles = `<html><head><style>${styles}</style></head><body><div style="display:flex; height: 100%;">${html}</div></body></html>
`;const fileName = `${name}.html`;const file = new File([htmlWithStyles], fileName, { type: 'text/html' });const oUrl = URL.createObjectURL(file);const a = document.createElement('a');a.style.setProperty('display', 'none');a.href = oUrl;a.download = file.name;document.body.appendChild(a);a.click();a.remove();const delay = 10000;setTimeout(() => URL.revokeObjectURL(oUrl), delay);
}

在页面代码中使用

我是class组件,函数组件用useRef就好了,思路就是通过ref获取html字符串

 <div className={styles.con} ref={this.contentRef}>123</div>this.contentRef = createRef(); // 在构造方法中定义// 导出html文件handleExport = name => {const div = this.contentRef.current;if (!div) return;const html = div.innerHTML;downHtmlFile({ html, name });};

最后效果

在这里插入图片描述

相关文章:

  • 前端知识(十七)——入口函数和特定函数的区别
  • 【复杂gRPC之Java调用go】
  • 记:vite3+vue3+axios前端项目跨域问题解决【前端和服务器nginx配置】
  • 【Spring】Spring统一功能处理
  • 计算机网络:数据链路层之差错控制、奇偶校验码、CRC循环冗余码、海明码
  • html通过CDN引入Vue组件抽出复用
  • 100天精通Python(可视化篇)——第110天:Pyecharts绘制可视化大屏项目(附上完整源码)
  • HttpURLConnection OOM问题记录
  • vr建筑虚拟实景展厅漫游体验更直观全面
  • running小程序重要技术流程文档
  • ubuntu-更改镜像源-系统初始化-安装Clion-C++编译环境-Java安装
  • Nginx的请求速率限制模块的两个关键参数rate和burst和相关代码语句的详细说明。
  • 使用阿里巴巴同步工具DataX实现Mysql与ElasticSearch数据同步
  • Python学习笔记-类
  • neuq-acm预备队训练week 8 P1144 最短路计数
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【mysql】环境安装、服务启动、密码设置
  • 【React系列】如何构建React应用程序
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Brief introduction of how to 'Call, Apply and Bind'
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java 内存分配及垃圾回收机制初探
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • nfs客户端进程变D,延伸linux的lock
  • October CMS - 快速入门 9 Images And Galleries
  • Promise面试题2实现异步串行执行
  • spring boot 整合mybatis 无法输出sql的问题
  • TypeScript迭代器
  • ViewService——一种保证客户端与服务端同步的方法
  • Vue.js 移动端适配之 vw 解决方案
  • 成为一名优秀的Developer的书单
  • 解决iview多表头动态更改列元素发生的错误
  • 聚类分析——Kmeans
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 在Mac OS X上安装 Ruby运行环境
  • Mac 上flink的安装与启动
  • ​Java基础复习笔记 第16章:网络编程
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)斐波那契Fabonacci函数
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (论文阅读30/100)Convolutional Pose Machines
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .NET 服务 ServiceController
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net和php怎么连接,php和apache之间如何连接
  • /var/lib/dpkg/lock 锁定问题
  • @antv/x6 利用interacting方法来设置禁止结点移动的方法实现。