代码之家  ›  专栏  ›  技术社区  ›  Triet Doan

如何在d3.js中为上下文菜单的创建和删除添加转换?

  •  0
  • Triet Doan  · 技术社区  · 4 年前

    我在创造一个 Force-Directed Graph 使用 D3.js

    No context menu

    带上下文菜单

    With context menu

    d3.easeCircleIn d3.easeCircleOut d3-ease 图书馆)。

    // Create context menu data
    const contextMenu = [
        {
            value: 1,
            type: 'unlock',
            icon: require('@/assets/images/unlock.svg'),
            text: 'Unlock the node to re-layout the graph'
        },
        {
            value: 1,
            type: 'info',
            icon: require('@/assets/images/info.svg'),
            text: 'Show node detailed information'
        }
    ];
    
    const pie = d3.pie()
        .value((d: any) => d.value)
        .padAngle(0.0349066); // 2 degrees in radian
    
    this._donutData = pie(contextMenu);
    
    this._arcGenerator = d3.arc()
        .innerRadius(this._options.nodeRadius * 1.35)
        .outerRadius(this._options.nodeRadius * 2.5)
    

    然后,在 click 事件,我使用以下函数创建圆环图:

    private createDonut(node: any) {
        const _me = this;
    
        return node.selectAll('arc')
            .data(this._donutData)
            .enter()
            .append('path')
            .attr('class', this._arcClass)
            .attr('d', this._arcGenerator)
            .attr('fill', '#eeeeee')
            .style('opacity', 0.7)
            .on('click', function (event: any, chosenArc: any) {
                
                // Remove other context menu
                d3.select(`.${ _me._contextMenuClass }`).remove();
    
                // Further processing...
    
            });
    }
    

    现在,我想补充一下 d3-transition 为了这个创造。我试图通过添加 .transition() 点击 事件)但它不起作用。

    // Doesn't work
    d3.select(`.${ _me._contextMenuClass }`)
        .transition()
        // transition duration and so on...
        .remove();
    

    那么,我应该怎么做才能将转换添加到上下文菜单中呢?谢谢你的帮助!

    0 回复  |  直到 4 年前
        1
  •  0
  •   Ruben Helsloot Rez    4 年前

    .transition() its own event system ,可以过渡到 opacity: 0 然后 .on("end", function() { d3.select(this).remove(); })