Gojs学习笔记

本文档深入探讨GoJS库的使用,包括节点模板的创建,如圆形节点和表格结构的节点;连线的定制,如改变线型和添加标签;布局的设置,如使用ForceDirectedLayout;以及各种事件处理,如主动事件的节点比例调整,被动事件的节点颜色改变,右击事件和连线变换事件。通过实例代码和截图展示了每个功能的实现效果。

gojs官方文档
这篇文档所写的案例在Githubsrc/components/MyModal目录下,data.js是展示数据,gojs_js.js是程序所在文件,其他文件不用管他

1.结点集

这里的结点不是gojs中的结点,而是表示一个整体的结点集合,表示的是myDiagram.nodeTemplate

定义结点思路:
结点定义 -> 结点配置 -> 结点形状 -> 结点内容

例:

let circleTemplate = $(go.Node, "Auto",
        $(go.Shape, {strokeWidth: 0}, 'Circle',
            new go.Binding("fill", "color"))
        $(go.TextBlock, {margin: 8},
            new go.Binding("text", "key"))
    );

画布是一个结点的拓展用法,可以利用table结构容纳结点子集
例:

let itemTemplate = $(go.Panel, "Horizontal",    //水平对齐
    $(go.Shape,
        {width: 10, height: 10, margin: 2, strokeWidth: 1, stroke: "#333"},
        new go.Binding("figure", "figure"),
        new go.Binding("fill", "color")),
    $(go.TextBlock,
        new go.Binding("text", "name")));

let PanelTemplate = $(go.Node, "Auto",
    {
        fromSpot: go.Spot.AllSides,     //这两行是申明from与to结点的接口地点为全边,连线默认在各边中点
        toSpot: go.Spot.AllSides,
        isShadowed: true,               //结点阴影,好看
        shadowColor: "#eee",
        shadowOffset: new go.Point(5, 5)
    },
    $(go.Shape, "RoundedRectangle", {strokeWidth: 3, stroke: "#eee", fill: "white"}),
    $(go.Panel, "Table",                //申明一个table类型的画布
        $(go.TextBlock,
            {
                row: 0,
                margin: new go.Margin(5, 15, 5, 15)
            },
            new go.Binding("text", "key")),
        $("PanelExpanderButton", "list", {row: 0, alignment: go.Spot.Right}),   //设计一个按钮,功能PanelExpand,设计对象名称为list
        $(go.Panel, "Vertical",
            {
                name: "list",       //申明画布名称为list,与PanelExpanderButton对应
                row: 1,
                defaultAlignment: go.Spot.Left,
                itemTemplate: itemTemplate  //子画布模版申明
            },
            new go.Binding("itemArray", "items")
        ))
);

画出来的是这样:

2.连线

默认线如上图,什么都没有定义的效果

设计结果如下:

源码:

let PanelLinkTemplate = $(go.Link,
    {
        selectionAdorned: true,
        layerName: "Foreground",
        routing: go.Link.AvoidsNodes,    //更改水平垂直方向线
        corner: 5,      //拐角弧度
        curve: go.Link.JumpOver
    },
    $(go.Shape, {stroke: "#aaa", strokeWidth: 2}),
    $(go.TextBlock,
        {
            segmentIndex: 0,    //from 标签
            segmentOffset: new go.Point(NaN, NaN),
            segmentOrientation: go.Link.OrientUpright
        },
        new go.Binding("text", "text")),
    $(go.TextBlock,
        {
            segmentIndex: -1,    //to 标签
            segmentOffset: new go.Point(NaN, NaN),
            segmentOrientation: go.Link.OrientUpright
        },
        new go.Binding("text", "toText")),
    $(go.Shape,
        {toArrow: "Standard", fill: "#aaa", stroke: null}),
);

3.布局

在初始化diagram的时候配上layout属性:

const diagram = $(go.Diagram, "myCanvas", {
    allowDelete: false,
    // 布局管理,否则挤在一起视觉效果很差
    layout: $(go.ForceDirectedLayout),
});

4.事件

事件驱动使用commit方法,具体参数

diagram.commit("函数,参数为diagram", "动作");

主动事件

在渲染画布后即可调用,下面这段程序是将key不等于one的结点按比例缩小

diagram.commit(function(d) {  // d === myDiagram
    d.nodes.each(function(node) {
        if (node.data.key !== "one") 
            node.scale = 0.5;   //修改比例
    });
}, "decrease scale");

被动事件

被动事件是由用户触发的

注:下面这段代码由官方提供,但是我在本机上不可实现

const triggerDiagram = useCallback((e) => {
    diagram.commit((d) => {
        d.selection.each(node => {
            console.log(node)
            var shape = node.findObject("SHAPE");
            // If there was a GraphObject in the node named SHAPE, then set its fill to red:
            if (shape !== null) {
                shape.fill = "red";
            }
        });
    }, "change color");
}, []);

右击事件

官网倒数第二个案例

连线可变换事件

官网倒数第一个案例

。。。(遇到新问题会及时跟进)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值