对我有用的方法是使用Reflex来渲染 SVG 。Reflex 使得将 DOM 对象呈现到网页并响应鼠标单击这些对象变得相当容易。使用 SVG(而不是 canvas)允许在初始显示后访问渲染的对象,用于选择和编辑(调整大小、移动、更改颜色、删除)。
下面是三个使用 reflex/svg 的“入门”示例。其中每一个都包含一个工作演示(链接到自述文件中)。
在由 circle-packing 包确定的位置渲染圆圈
交互式骑士巡回动画。
旋转 3D 立方体
鉴于这些示例是基于反射的,它们都是使用 FRP 编码风格编写的,但我试图最小化每个程序中专门使用 FRP 技术的部分。
例如,骑士之旅和旋转立方体都有一个递归执行代码块,只包含对查看和更新的调用。在这两种情况下,此代码块都支持从视图到状态变化累积的反馈( foldDyn 更新)
从旋转立方体示例:
rec
view modelOrientation
modelOrientation <- foldDyn update initialOrientation tick
来自骑士之旅的例子:
rec
startEvent <- view width height rowCount colCount board tour
tour <- foldDyn (update board) [] $ leftmost [startEvent, advanceEvent]
我发现开始使用 reflex 的最简单方法是克隆reflex-platform github 存储库并运行该存储库中包含的 try-reflex 脚本 - 完全按照 reflex-platform 自述文件中的说明
circle-packing 示例需要circle-packing 包。旋转 3d 立方体示例需要matrix 包。要启用这些包的使用,请在运行 try-reflex 之前将它们包含在 reflex-platform 的 packages.nix 中 - 再次按照 reflex-platform 自述文件中的说明。