react-konva
,它呈现一个管理底层画布/上下文的 <Stage>
组件。
canvas2svg
与它一起使用,它基本上是画布上下文的包装器,用于跟踪画布上的所有绘制,并在您准备好访问它时维护 svg 表示形式。它不会修改画布 api,因此理论上,Konva 不会受到影响,因为它的画布绘制调用是相同的 - 它们只需要位于 canvas2svg 生成的上下文中,而不是 konva 自动生成的上下文中。
我们正在寻找类似的东西,但它似乎不存在。我们有什么方法可以使用 ref 或以其他方式破解 Konva 使用 C2S 上下文吗?或者也许我们缺少一个内置属性。
var c2sContext = new C2S(500,500);
<Stage context={c2sContext}>
canvas2svg
实际上并不与普通渲染的画布一起工作(它是一个替代方案 - 例如,arc()
方法仅渲染为 svg,而不是 svg + canvas),因此您需要将渲染上下文替换为c2s 实例,调用 render 以便调用像 arc()
这样的方法,然后将其设置回来。
您可以在 konva
Layer
上使用 ref 并在按下按钮时运行如下代码:
setTimeout(() => {
var oldContext = this.layerRef.canvas.context._context;
var c2s = this.layerRef.canvas.context._context = C2S({...this.state.containerSize, ctx: oldContext});
this.forceUpdate();
setTimeout(() => {
console.log(c2s.getSerializedSvg());
this.layerRef.canvas.context._context = oldContext;
this.forceUpdate();
})
}, 5000);
两种可能的解决方案可以绕过
canvas2svg
的需求:
显然#2 存在性能问题,#1 需要更混乱的代码 - 而#2 仍然需要一些额外的代码/混乱,但两者都是需要注意的好选择。
有一个库可以做到这一点,这是相当新的,并且是为react-konva制作的。我做了一些测试,看起来效果很好。
友情链接:
https://www.npmjs.com/package/react-konva-to-svg