在 React 应用程序中使用 D3 渲染元素的价格?

Posted

技术标签:

【中文标题】在 React 应用程序中使用 D3 渲染元素的价格?【英文标题】:The price of rendering elements using D3 in a React application? 【发布时间】:2017-12-25 08:02:52 【问题描述】:

我正在尝试了解如何集成 D3 和 React。具体来说,我试图了解使用 D3 呈现可视化效果如何影响 React。如this excellent question and it's reply 中所述:

[...] 目前没有很好的方式来使用 React 和 D3 [...] 这是因为在 React 世界中你不直接进行 DOM 操作,但在 d3 世界中这是唯一的事情你会的。

回复继续说

在我看来,目前对 Force Layouts 和 就像是简单地退出那些组件的 React 并让 d3 做 它的东西。这并不理想,但性能更高。

让 D3 负责渲染对 React 有什么影响?它只会影响使用 D3 的组件的性能还是其他组件的性能?例如,是否会以某种方式使用 D3 直接操作 DOM 与 React 的虚拟 DOM?我基本上是想了解使用 D3 必须付出的代价。

【问题讨论】:

这两篇文章可能有用:medium.com/@Elijah_Meeks/…accelebrate.com/blog/… 【参考方案1】:

我参与了一个项目(不幸的是,私人项目),我使用 D3 来表示 UML 编辑器。一切都使用 SVG 操作来绘制代表 UML 的 SVG。

编辑器 UI 逻辑是使用 TypeScript 和 D3 在独特的 React 元素 (UMLEditor) 中实现的。您可以传递编辑器属性来设置 UML 中的更改,并通过回调来取回数据。例如,您可以拖放一个 UML 类(以 60fps 为单位),但 UI 只触发两个事件(拖放)到 React 回调。

关键是将逻辑和事件从UI操作中分离出来,并有少量的大反应元素,而不是那么多的小元素。

它可以管理具有大约 4K 类、30fps 的 UML。

编辑:让我们定义一个小应用程序。 你有 small react 组件及其子元素,例如根 App 元素、导航栏、视口等...

除 UMLEditor 之外的每个元素对性能的影响都很小。 UMLEditor 元素是一个没有任何 React 子元素的复杂元素。其中的每个 UI 元素都是使用 D3 渲染的。 UMLEditor 的真实 DOM 包含一个完全使用 D3 管理的复杂 SVG 元素。

为了让这个元素与 React 交互,我们作为道具传递回调事件,如拖放、创建新的 UML 类...和一个具有所有 D3 渲染逻辑的 JavaScript 类

我们将整个 UML 配置作为道具传递,因为它会对性能产生负面影响。相反,当我们需要它用于导出目的时,作为 prop 传递的 javascript 类可以使用方法提供整个 UML 配置。

【讨论】:

感谢这个令人鼓舞的例子。我不确定我是否完全理解在您的示例中哪个组件正在执行渲染。您是说 D3 根据发送到 UMLEditor 的道具渲染所有内容吗?还是基于回调的 React 渲染? @langkilde 我已经用更多信息编辑了答案。如果还不清楚,请告诉我。 这是一个有用的说明。我觉得它仍然没有完全回答这个问题,即在您让 D3 管理的复杂 SVG 元素之外,这会如何影响 React 的性能。例如,对虚拟 DOM 有什么影响吗?我有一个非常基本的了解,所以也许我没有正确阅读您的回复。

以上是关于在 React 应用程序中使用 D3 渲染元素的价格?的主要内容,如果未能解决你的问题,请参考以下文章

Renderer2 在使用 d3 js - Angular 4 时不渲染 SVG 元素

在同一个 div 中渲染 Reactjs 多个“d3js”子组件

如何在 React 中渲染嵌套数组元素?

如何在 React 中渲染由 createElement() 创建的元素?

html D3:render,.selectAll,.data,.append,selector.text:渲染文本元素,然后替换元素

React——条件渲染