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

React(2): 使用 html2canvas 生成图片

使用 html2canvas 生成图片

需求

  1. 将所需的内容生成图片
  2. div 中包括 svg

前置准备

 "react": "^18.2.0","react-dom": "^18.2.0","html2canvas": "^1.4.1",

实现

<div ref={payRef}></div>
const payRef = useRef<HTMLDivElement>(null);function generateImg() {if (orderRef.current) {html2canvas(orderRef.current, {useCORS: true,allowTaint: true, //开启跨域}).then((canvas) => {Toast.show('生成图片成功');const link = document.createElement('a');link.href = canvas.toDataURL();link.setAttribute('download', '订单详情.png');link.style.display = 'none';document.body.appendChild(link);link.click();document.body.removeChild(link);});}
}

生成的图片

在这里插入图片描述

出现的问题

svg 导不出来

百度了下发现都是用 canvg,但是发现不生效,查看了下 结构, 发现我用的是 vite-plugin-svg-icons 这个 vite 插件,你会发现 svg 里面的东西引用都在外面…

结构是这样的

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

不在同个 div 下面根本拿不到,然后我脑里突然想: 那我把它怼进去不就行了

更改

这里用 any 纯属无奈 ╮(╯▽╰)╭,因为 USEElementSymbolElement 定义就报错…,有大佬可以给我支下招

export function changeToCanvas(element: HTMLDivElement) {const svgElems = element.querySelectorAll('svg');let elems: SVGElement[] = [...svgElems];elems.forEach((node: SVGElement) => {// 拿到 symbol 的 use 属性const childNodes: any = node.childNodes[0];// 除去 # 这个属性 拿到对应值const id = childNodes.href.baseVal.slice(1);// 拿到 Symbol 标签let symbol: any = document.getElementById(id)?.cloneNode(true);// 获取填充颜色let fill = window.getComputedStyle(node)['fill'];// 填充颜色symbol.style.fill = fill;// 直接把他塞到 use 中childNodes.appendChild(symbol);});
}

使用

<div ref={payRef}></div>
const payRef = useRef<HTMLDivElement>(null);function generateImg() {if (orderRef.current) {changeToCanvas(orderRef.current);html2canvas(orderRef.current, {useCORS: true,allowTaint: true, //开启跨域}).then((canvas) => {Toast.show('生成图片成功');const link = document.createElement('a');link.href = canvas.toDataURL();link.setAttribute('download', '订单详情.png');link.style.display = 'none';document.body.appendChild(link);link.click();document.body.removeChild(link);});}}

然后点击生成,打开控制台发现 use 中的内容给我硬塞进去了

在这里插入图片描述

然后生成的图片也没有问题

在这里插入图片描述

最后

如果大佬们有更好的建议可以私信我一下 ()

更新

暂无

http://www.lryc.cn/news/275706.html

相关文章:

  • CAN物理层协议介绍
  • 华为OD机试真题-计算面积-2023年OD统一考试(C卷)
  • 设计模式之策略模式【行为型模式】
  • git使用(完整流程)
  • 九、HTML头部<head>
  • 机器学习期末复习
  • python-日志模块以及实际使用设计
  • googlecode.log4jdbc慢sql日志,格式化sql
  • Linux程序、进程和计划任务
  • 【MySQL】索引基础
  • 精确管理Python项目依赖:自动生成requirements.txt的智能方法
  • JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式)
  • java SSM体育器材租借管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
  • 西电期末1030.函数的最大值
  • 在Docker中安装Tomact
  • 【书生大模型00--开源体系介绍】
  • 基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理
  • 一款开源的MES系统
  • https配置证书
  • 图神经网络|10.4 GCN 变换原理的解读
  • 计算机组成原理 I/O方式
  • VMWare网络配置
  • opencv期末练习题(3)附带解析
  • 51单片机之LED灯
  • 操作系统内存碎片
  • 三菱plc学习入门(二,三菱plc指令,触点比较,计数器,交替,四则运算,转换数据类型)
  • Spring学习之——代理模式
  • 【Linux】之搭建 PostgreSQL 环境
  • docker 安装elasticsearch、kibana、cerebro、logstash
  • C/C++ 联合体