vue中使用antvG6实现自定义树形结构

复制粘贴即可,记得先安装antv

npm install --save @antv/g6
<template>
    <div class="myDiv">
        <div id="mountNode"></div>
    </div>
</template>

<script>
import G6 from '@antv/g6';
export default {
    name: '',
    components: {},
    props: {},
    data() {
        return {
            data: {
                id: "111",//节点id
                x: 200,
                y: 100,
                shape: 'image',//节点显示的类型,可以是矩形rect等或者图片形式
                label: 'image',
                img: '../../../../static/img/mcenter.png',
                size: [100, 130],//节点大小
                "children": [
                    {
                        "id": "第二舰队",
                        img: '../../../../static/img/jd2.png',
                        size: [90, 60],
                        shape: 'image',
                        label: 'image',
                        "children": [
                            { shape: 'rect', size: [240, 30], "id": "21", shape: 'multipleLabelsNode', level: 3, label: ["node2", "人员"] },
                            { shape: 'rect', size: [240, 30], "id": "22", shape: 'multipleLabelsNode', level: 3, label: ["node2", "装备"] },
                            { shape: 'rect', size: [240, 30], "id": "23", shape: 'multipleLabelsNode', level: 3, label: ["node2", "基地"] },
                            { shape: 'rect', size: [240, 30], "id": "24", shape: 'multipleLabelsNode', level: 3, label: ["node2", "战争"] },
                            { shape: 'rect', size: [240, 30], "id": "25", shape: 'multipleLabelsNode', level: 3, label: ["node2", "该级战舰"] },
                        ]
                    },
                    {
                        "id": "第三舰队",
                        img: '../../../../static/img/jd3.png',
                        shape: 'image',
                        size: [90, 60],
                        "children": [
                            { shape: 'rect', size: [240, 30], "id": "31", shape: 'multipleLabelsNode', level: 3, label: ["node2", "人员"] },
                            { shape: 'rect', size: [240, 30], "id": "32", shape: 'multipleLabelsNode', level: 3, label: ["node2", "装备"] },
                            { shape: 'rect', size: [240, 30], "id": "33", shape: 'multipleLabelsNode', level: 3, label: ["node2", "基地"] },
                            { shape: 'rect', size: [240, 30], "id": "34", shape: 'multipleLabelsNode', level: 3, label: ["node2", "战争"] },
                            { shape: 'rect', size: [240, 30], "id": "35", shape: 'multipleLabelsNode', level: 3, label: ["node2...", "该级战舰"] },
                        ]
                    },
                    {
                        "id": "第四舰队",
                        img: '../../../../static/img/jd4.png',
                        shape: 'image',
                        size: [90, 60],
                        "children": [
                            { shape: 'rect', size: [240, 30], "id": "41", shape: 'multipleLabelsNode', level: 3, label: ["node2", "人员"] },
                            { shape: 'rect', size: [240, 30], "id": "42", shape: 'multipleLabelsNode', level: 3, label: ["node2", "装备"] },
                            { shape: 'rect', size: [240, 30], "id": "43", shape: 'multipleLabelsNode', level: 3, label: ["node2", "基地"] },
                            { shape: 'rect', size: [240, 30], "id": "44", shape: 'multipleLabelsNode', level: 3, label: ["node2", "战争"] },
                            { shape: 'rect', size: [240, 30], "id": "45", shape: 'multipleLabelsNode', level: 3, label: ["node2", "该级战舰"] },
                        ]
                    },
                    {
                        "id": "第五舰队",
                        img: '../../../../static/img/jd5.png',
                        shape: 'image',
                        size: [90, 60],
                        "children": [
                            { shape: 'rect', size: [240, 30], "id": "51", shape: 'multipleLabelsNode', level: 3, label: ["node2", "人员"] },
                            { shape: 'rect', size: [240, 30], "id": "52", shape: 'multipleLabelsNode', level: 3, label: ["node2", "装备"] },
                            { shape: 'rect', size: [240, 30], "id": "53", shape: 'multipleLabelsNode', level: 3, label: ["node2", "基地"] },
                            { shape: 'rect', size: [240, 30], "id": "54", shape: 'multipleLabelsNode', level: 3, label: ["node2", "战争"] },
                            { shape: 'rect', size: [240, 30], "id": "55", shape: 'multipleLabelsNode', level: 3, label: ["node2", "该级战舰"] },
                        ]
                    },
                    {
                        "id": "第六舰队",
                        img: '../../../../static/img/jd6.png',
                        shape: 'image',
                        size: [90, 60],
                        "children": [
                            { shape: 'rect', size: [240, 30], "id": "61", shape: 'multipleLabelsNode', level: 3, label: ["node2", "人员"] },
                            { shape: 'rect', size: [240, 30], "id": "62", shape: 'multipleLabelsNode', level: 3, label: ["node2", "装备"] },
                            { shape: 'rect', size: [240, 30], "id": "63", shape: 'multipleLabelsNode', level: 3, label: ["node2", "基地"] },
                            { shape: 'rect', size: [240, 30], "id": "64", shape: 'multipleLabelsNode', level: 3, label: ["node2", "战争"] },
                            { shape: 'rect', size: [240, 30], "id": "65", shape: 'multipleLabelsNode', level: 3, label: ["node2", "该级战舰"] },
                        ]
                    },
                    {
                        "id": "第七舰队",
                        img: '../../../../static/img/jd7.png',
                        shape: 'image',
                        size: [90, 60],
                        "children": [
                            { shape: 'rect', size: [240, 30], "id": "71", shape: 'multipleLabelsNode', level: 3, label: ["node2", "人员"] },
                            { shape: 'rect', size: [240, 30], "id": "72", shape: 'multipleLabelsNode', level: 3, label: ["node2", "装备"] },
                            { shape: 'rect', size: [240, 30], "id": "73", shape: 'multipleLabelsNode', level: 3, label: ["node2", "基地"] },
                            { shape: 'rect', size: [240, 30], "id": "74", shape: 'multipleLabelsNode', level: 3, label: ["node2", "战争"] },
                            { shape: 'rect', size: [240, 30], "id": "75", shape: 'multipleLabelsNode', level: 3, label: ["node2", "该级战舰"] },
                        ]
                    },
                    {
                        "id": "第十舰队",
                        img: '../../../../static/img/jd10.png',
                        shape: 'image',
                        size: [90, 60],
                        "children": [
                            { shape: 'rect', size: [240, 30], "id": "11", shape: 'multipleLabelsNode', level: 3, label: ["node2", "人员"] },
                            { shape: 'rect', size: [240, 30], "id": "12", shape: 'multipleLabelsNode', level: 3, label: ["node2", "装备"] },
                            { shape: 'rect', size: [240, 30], "id": "13", shape: 'multipleLabelsNode', level: 3, label: ["node2", "基地"] },
                            { shape: 'rect', size: [240, 30], "id": "14", shape: 'multipleLabelsNode', level: 3, label: ["node2", "战争"] },
                            { shape: 'rect', size: [240, 30], "id": "15", shape: 'multipleLabelsNode', level: 3, label: ["node2", "该级战舰"] },
                        ]
                    }
                ]
            },
            graph: {}

        }
    },
    watch: {},
    computed: {},
    methods: {
        render() {
            G6.registerNode("multipleLabelsNode", {
                // 绘制节点
                draw(cfg, group) {
                    console.log(cfg, group, '00')
                    var shape = this.drawShape(cfg, group);
                    if (cfg.label && cfg.label.length) {
                        this.drawLabel(cfg, group);
                    }
                    return shape;
                },


                // 绘制label
                drawLabel(cfg, group) {
                    console.log(cfg, group, '11')
                    var size = this.getSize(cfg);
                    var width = 240;
                    const height = 70;
                    var label = cfg.label;
                    // 绘制第三层级节点的第一个label样式,先绘制一个矩形框
                    group.addShape("rect", {
                        attrs: {
                            x: -120,
                            y: -15,
                            fill: "#D4F0E1",
                            width: 100,
                            height: 30,
                            radius: [2, 4]
                        }
                    });
                    //再添加label文本
                    group.addShape("text", {
                        attrs: {
                            text: label[0] || "",
                            x: 0 - width / 2 + 5,
                            y: 0,
                            fill: "#222",
                            textAlign: "left",
                            textBaseline: "middle"
                        }
                    });
                    if (label.length > 1) {
                        // 绘制第三层级节点的第二个label样式,同样先绘制一个矩形框
                        group.addShape("rect", {
                            attrs: {
                                text: label[1] || "",
                                x: 20,//矩形框的相对节点的横坐标位置
                                y: -15,//矩形框的相对节点的纵坐标位置
                                fill: "#C3D4EE",
                                width: 100,
                                height: 30,
                                radius: [2, 4]//矩形框圆角设置
                            }
                        });
                        //再添加label文本
                        group.addShape("text", {
                            attrs: {
                                text: label[1] || "",
                                x: 60,
                                y: 0,
                                fill: "#222",
                                textAlign: "center",
                                textBaseline: "middle",
                                fontWeight: "bold"
                            }
                        });
                    }
                }
            }, "rect")
            var graph = new G6.TreeGraph({
                container: 'mountNode',
                width: window.innerWidth,
                height: window.innerHeight,
                pixelRatio: 2,
                modes: {
                    default: [{
                        type: 'collapse-expand',
                        onChange: function onChange(item, collapsed) {
                            var data = item.get('model').data;
                            data.collapsed = collapsed;
                            return true;
                        }
                    }, 'drag-canvas', 'zoom-canvas']
                },
                layout: {
                    nodesepFunc: () => 3, //这个就是节点与节点之间的距离,可以说是纵向拉伸高度
                    ranksepFunc: () => 30,//这个参数设置的是你的箭头距离节点的距离,值越大,图横向拉伸的越宽
                },
                //默认节点设置
                defaultNode: {
                    size: 16,
                    anchorPoints: [[0, 0.5], [1, 0.5]],
                    style: {
                        fill: '#F4F4F4',
                        stroke: '#F4F4F4'
                    },
                    radius: [2, 4],

                },
                //默认边设置
                defaultEdge: {
                    shape: 'cubic-horizontal',//有很多类型可以看官方文档api
                    // shape: 'line-arrow',
                    style: {
                        stroke: '#3D3D6D'
                    }
                },
                layout: {
                    type: 'mindmap',
                    direction: 'H',
                    getHeight: function getHeight() {
                        return 16;
                    },
                    getWidth: function getWidth() {
                        return 16;
                    },
                    getVGap: function getVGap() {
                        return 10;
                    },
                    getHGap: function getHGap() {
                        return 100;
                    }
                }
            });

            var centerX = 0;
            graph.node(function (node) {
                if (node.id === 'Modeling Methods') {
                    centerX = node.x;
                }
                //由于我前两层级节点都是用图片展示里面包含label文字,因此我判断层级为第三层级的时候再显示label
                if (node.level == 3) {
                    return {
                        label: node.label,//用于是否显示label标签
                        labelCfg: {
                            position: node.children && node.children.length > 0 ? 'left' : node.x > centerX ? 'right' : 'left'
                        }
                    };
                } else {
                    return {
                        style: {
                            fill: '#40a9ff',
                            stroke: '#096dd9'
                        },
                        label: '',
                        labelCfg: {
                            position: node.children && node.children.length > 0 ? 'left' : node.x > centerX ? 'right' : 'left'
                        }
                    };
                }

            });
            // 单击节点事件
            graph.on('node:click', (e) => {
                const nodeItem = e.item // 获取被点击的节点元素对象
                console.log('单击', nodeItem._cfg)
            })

            graph.data(this.data);
            graph.render();
            graph.fitView();
        }
    },
    created() { },
    mounted() {
        this.render()
    }
}
</script>
<style lang="less" scoped>
#mountNode {
    width: 100%;
    height: 90%;
    background: url("../../../../static/img/jdbg.png");
    background-size: 100% 90%;
}
@media screen and (min-width: 200px) and (max-width: 1600px) {
}
@media screen and (min-width: 1601px) {
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 安装antvG6 ```bash npm install @antv/g6 --save ``` 2. 在Vue组件引入antvG6 ```vue <template> <div id="container"></div> </template> <script> import G6 from '@antv/g6'; export default { name: 'CustomLine', mounted() { this.initGraph(); }, methods: { initGraph() { const data = { nodes: [ { id: 'node1', x: 100, y: 100 }, { id: 'node2', x: 200, y: 200 }, { id: 'node3', x: 300, y: 300 }, ], edges: [ { source: 'node1', target: 'node2', type: 'custom-line' }, { source: 'node2', target: 'node3', type: 'custom-line' }, ], }; G6.registerEdge('custom-line', { draw(cfg, group) { const startPoint = cfg.startPoint; const endPoint = cfg.endPoint; const shape = group.addShape('path', { attrs: { stroke: '#333', lineWidth: 2, path: [ ['M', startPoint.x, startPoint.y], ['L', endPoint.x, endPoint.y], ], }, name: 'path-shape', }); return shape; }, }); const graph = new G6.Graph({ container: 'container', width: 500, height: 500, defaultEdge: { type: 'custom-line', }, }); graph.data(data); graph.render(); }, }, }; </script> ``` 3. 在注册Edge时,通过draw方法自定义折线的绘制方式。在draw方法,可以获取到边的起点和终点,然后通过group.addShape('path', {...})方法绘制出折线。最后将折线作为返回值即可。 4. 在Graph实例,可以通过defaultEdge配置项来指定所有边的类型,也可以通过edges配置项来指定单个边的类型。通过type属性来指定边的类型为custom-line即可。 5. 在上面的示例,我们仅仅是绘制了一条直线。如果需要绘制更复杂的折线,可以在path数组添加更多的点来控制折线的形状。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suoh's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值