我的用例是:我有一个网站编辑器和一个可供用户使用的网页列表。此列表中的每一页都由一个缩略图表示。每次用户使用编辑器对页面进行更改时,都必须更新相应站点的缩略图以反映更改。我正在做的方式是在页面中安装一个 ThumbnailSandbox 组件,从 Redux 商店传递道具,然后使用 dom-to-png 创建屏幕截图并在列表中使用它。但我想在页面上不安装组件的情况下这样做,因为我认为这将是一个更清洁的解决方案,并且受其他交互影响的可能性更小。因此,我创建了一个CodeSanbox来说明我想要实现的目标。
我的逻辑是这样的:
import React from "react";
import ReactDOMServer from "react-dom/server";
import html2canvas from "html2canvas";
import MyComp from "./component.jsx";
export const createScrenshot = () => {
const el = (
<div>
test component <MyComp />
</div>
);
const markup = ReactDOMServer.renderToString(el);
let doc = new DOMParser().parseFromString(markup, "text/html");
let target = doc.body.getElementsByClassName("my-comp")[0];
console.log(markup, target);
html2canvas(target, {
useCORS: true,
allowTaint: true,
scale: 1,
width: 500,
height: 500,
x: 0,
y: 0,
logging: true,
windowWidth: 500,
windowHeight: 500
})
.then(function(canvas) {
console.log(">> ", canvas);
})
.catch(error => {
console.log(error);
});
};
因此,我将组件传递给 ReactDOM,然后使用第一步中的字符串创建一个 DOM 节点并将该节点传递给 html2canvas。但此时我得到了错误Uncaught TypeError: Cannot read property 'pageXOffset' of null
。因为传递给 html2canvas 的元素的 ownerDocument 为 null 并且它没有属性:devicePixelRation、innerWidth、innerHeight、pageYOffset 和 pageXOffset。据我了解,这是因为节点元素不是 DOM 的一部分。
现在,我的问题是:
1)有没有办法使用 html2canvas 解决这个问题?
2)有没有其他方法可以在浏览器中截取 React 组件的屏幕截图,而无需在 DOM 中安装组件?
先感谢您!!