antvis/G6

在G6中有什么好的办法可以在hover边的时候在边的中点处显示自定义react组件(随画布缩放),同时点击组件弹出ant.design的popover #4619

lovelyGFR posted onGitHub

问题描述

有什么好的办法可以在hover边的时候在中点处显示自定义react组件(随画布缩放),同时点击组件弹出popover

同时在自定义节点的时候我是通过这种方式解析的react组件,不知道之后会不会有什么问题。还是说最好用原生 html: ReactDOMServer.renderToString( <CustomNode .../> )

重现链接

https://g6.antv.antgroup.com/examples/item/customEdge/#extraShape

重现步骤

如上

预期行为

如上

平台

  • 操作系统: [macOS, Windows, Linux, React Native ...]
  • 网页浏览器: [Google Chrome, Safari, Firefox]
  • G6 版本: [4.5.1 ... ]

屏幕截图或视频(可选)

No response

补充说明(可选)

No response


@lovelyGFR 可以贴下你的设计稿。我目前的理解是可以通过自定义React组件,监听边的mouseEnter事件来实现展示的组件,代码可以参考:https://github.com/antvis/Graphin/blob/master/packages/graphin/src/components/Tooltip/useTooltip.tsx#L138

posted by pomelo-nwu almost 2 years ago

@lovelyGFR 可以贴下你的设计稿。我目前的理解是可以通过自定义React组件,监听边的mouseEnter事件来实现展示的组件,代码可以参考:https://github.com/antvis/Graphin/blob/master/packages/graphin/src/components/Tooltip/useTooltip.tsx#L138

大概是这样,hover边才显示这个badge组件,然后点击badge组件弹出popover,但同时badge组件需要随画布缩放,是不是只能同时监听画布的zoom来缩放组件的大小。 还有一个问题就是在我的描述中我使用了ReactDOMServer.renderToString去强转react组件,不知是否恰当 wecom-temp-68405-69313add5712594e96c6e90a3c5138d6

posted by lovelyGFR almost 2 years ago

「ReactDOMServer.renderToString去强转react组件」没有尝试过。G6官方的上层组件库 是这么实现的:https://graphin.antv.antgroup.com/components/built-in/tooltip

posted by pomelo-nwu almost 2 years ago

「ReactDOMServer.renderToString去强转react组件」没有尝试过。G6官方的上层组件库 是这么实现的:https://graphin.antv.antgroup.com/components/built-in/tooltip

那G6中有可以在节点或边定义时使用自定义react组件的例子嘛(之前看的react-node那个库也是套的标签),因为定义dom的话G6的一些事件(graph.on('node.click'))就不支持,在之后要实现的交互中就会比较苦恼QAQ

posted by lovelyGFR almost 2 years ago

@lovelyGFR 直接支持不太好支持,如果是SVG,我们可以用 foreignObject,这样就可以让react托管渲染流程。

posted by pomelo-nwu almost 2 years ago

@pomelo-nwu 其实在项目中我的renderer定义的就是svg,通过这样的方式

const shape = group.addShape('dom', {
        attrs: {
            class: 'foreign-object-shape-node',
            x: 0,
            y: 0,
            width: NODE_WIDTH,
            height: NODE_HEIGHT,
            html: ReactDOMServer.renderToString(
                <EntityNode
                    entityName={cfg.entityName}
                    entityType={cfg.entityType}
                    editUrl={cfg.editUrl}
                    behavior={cfg.behavior}
                />
            )
        },
        events: true
    });

渲染出来的也确实是foreignObject包裹起来的react组件,但是由于是自定义dom,无法监听

所以说我如果想要让graph监听到我的节点交互事件,还是应该老老实实的一步步画shape的方式进行下去嘛

posted by lovelyGFR almost 2 years ago

@lovelyGFR 是的

posted by pomelo-nwu almost 2 years ago

@lovelyGFR 是的

谢谢您的耐心解答,这帮助了我很多,祝您周末愉快~

posted by lovelyGFR almost 2 years ago

方便的话可以点个 Star 鼓励一下,哈哈

posted by Yanyan-Wang almost 2 years ago

Fund this Issue

$0.00
Funded

Pull requests