有许多帖子解决了这个问题的一些变体——其中最流行的建议是重新设计父子层次结构,以符合具有单向数据流的反应原则。我目前正在使用一个简单的应用程序,该应用程序旨在使用 react-vis 制作一些 webplots,这是一个不再维护的相对较大的绘图包。
我的问题是图例组件和绘图组件是分开的,理想情况下,人们想访问绘图组件内的一些变量来设置图例的基本参数。我已经根据 react-vis 文档中的一个示例找到了一个简单的组件。对于此示例,我想访问HexbinSeries中的一个变量,然后通过控制台将其登录到主应用程序中。
import React, {useEffect} from 'react';
import {XYPlot, XAxis, YAxis, HexbinSeries} from 'react-vis'
export const EasyPlot = () => {
const DATA = [
{"eruptions": 3.6, "waiting": 79},
{"eruptions": 3.6, "waiting": 79},
{"eruptions": 3.6, "waiting": 79},
{"eruptions": 1.8, "waiting": 54},
{"eruptions": 4.533, "waiting": 85}
];
useEffect(() => {
//console.log('var from HexbinSeries logged here')
})
return (
<div>
<XYPlot
width={400}
getX={d => d.waiting}
getY={d => d.eruptions}
height={400}
>
<HexbinSeries
colorRange={['orange', 'cyan']}
radius={10}
data={DATA}
/>
<XAxis />
<YAxis />
</XYPlot>
</div>
);
};
该图应该是一个六边形直方图,其中一个六边形的计数为 3,而其他六边形的计数为 1(来自数据)。实际的 HexbinSeries 组件使用 d3-hexbin 来构造绘图的路径,并且可以很容易地从这个构造中推导出每个六边形的总计数。
天真的解决方案是在主应用程序上重现此过程(在我的数据集上运行 d3-hexbin),并从那里确定计数。但理想情况下,我希望避免每次渲染都在大型数据集上重新运行 d3-hexbin 两次,特别是如果该图是交互式的并且我们需要使用计数更新图例。
第二个天真的解决方案是拥有一个全局变量或一些 DOM 元素,我将在 HexbinSeries.js 中手动访问以进行更改。但这显然是一种一次性解决方案。
编辑:
另一种方法是让父级将 setState 作为道具传递给 HexbinSeries。但是,HexbinSeries的编写方式超出了我的理解,目前它似乎没有构造函数。