reactjs - 如何使用 redux 操作更新 d3 图?
问题描述
我正在尝试使用在鼠标事件(mouseenter、mouseleave)中调用的 redux 操作来存储来自工具提示的数据。
问题:当鼠标光标位于元素(g 元素)上时,我只期望mouseenter
事件但mouseleave
也被触发。这会导致更新 redux 存储并在循环中重新渲染 react 组件。
我有一个 svg 元素,然后我附加 g 元素,它是圆形和文本的包装器。我在 g 元素上添加了事件监听器。
这是我的代码:
const SomeReactComponent =() => {
const dispatch = useDispatch();
const createChart = () => {
const svg = d3
.select(svgNode)
.attr('width', width + margin.left + margin.right)
.attr('height', height + margin.top + margin.bottom)
.style('border', '2px solid black')
.append('g')
.attr(
'transform',
`translate(${width / 2 + margin.left / 2},${height / 2 + margin.top})`
);
const Tooltip = d3
.select('.polar-scatter-chart')
.append('div')
.attr('class', 'tooltip');
const wrapper = svg
.selectAll('Points')
.data(newData)
.enter()
.append('g')
.on('mouseenter', ({ id, name, themeName }) => {
Tooltip.html(name)
.style('visibility', 'visible')
.style('top', `${d3.event.pageY - 350}px`)
.style('left', `${d3.event.pageX}px`);
dispatch(handleTooltip({ id, themeName }));
}
})
.on('mouseleave', () => {
Tooltip.style('visibility', 'hidden');
dispatch(handleTooltip({ id: '', themeName: '' }));
});
wrapper
.append('circle')
.attr('class', 'point')
.attr('transform', (d, i) => {})
.attr('r',7)
wrapper
.append('text')
.attr('transform', (d) => {})
.text((d) => some_text);
};
}
createChart();
return (
<div className="polar-scatter-chart">
<svg ref={svgRef} />
</div>
);
}
如何使用 redux 操作正确更新 d3 图?
感谢您的回答
解决方案
您在每次渲染时调用 createChart,创建一组全新的元素,这些元素可能位于已经存在的元素之上。因此,每次,您“离开”旧元素,因为您“进入”了在顶部绘制的元素。
如果你想这样做,你应该createChart
在一个useEffect
调用中包装并且只执行一次。
但更好的主意是使用 D3 库进行反应。
推荐阅读
- nginx - 想通过 nginx 将服务器 url 重定向到 server/somestring
- python - Python:计算月份日期之间的差异
- android - 发生视图回收时,Listview 备用行颜色失败
- regex - 如何对嵌套的动态键应用 Mongo DB 查找命令
- asp.net - 根据第一个下拉asp.net的选择填充下拉值和项目
- python - 检测嘈杂的背景/对象 - OpenCV
- java - 如何使用 pdfHtml 插件使用 iText 7 或 5 实现 Aztec-barcode?
- laravel - 在具有多个附加搜索过滤器的类似查询中使用数组
- python - 在栅格中查找方向变化的算法
- javascript - js树在处理选中/取消选中事件并将所有复选框设置为true时不起作用