go.js的基本使用(主要是vue,react同理)

gojs在vue中实现画布流程 GoJS 是一个用于实现交互式图表的 JavaScript 库,详情可查看根据官网实现以下demo。 阅读详情
AI摘要

本文详细介绍go.js的基本使用方法,包括安装、去除水印、在Vue中应用实例等。此外,还介绍了如何添加实用功能,如树形节点的展开与折叠等。

一、go.js的基本使用

引言:首先写这篇文章是为了记录一下自己用到的api,以及接触到的设置方法,部分详解有摘自其他博主的文章,我主要是在vue中使用,涉及到业务方面的就不过多解释,react我也自测过,都是同一个套路,希望本篇文章能帮助到各位码友!!!

1.官方文档
2.安装,以及去除水印的方法
 npm install gojs --save
  • 我目前装的应该现在最新版的 “gojs”: “^2.2.14”,

  • 我在博客也搜到不少解决的方法,在这里就分享两种方法:

  • 第一种: 在node_modules中找到go.js,go.mjs,go-module.js路径如下:node_modules/gojs/release/go.js,go.mjs,go-module.js (注意:最好是这三个文件都要改,有些码友说设置了没用,原因是只设置了go.js)

这一种也是我目前使用的方法: 在三个文件全局搜索 7ca11abfd022028846 然后将这一行的剩余部分全部删除,下面是我已经删除后的照片:记得三个文件都要删除

在这里插入图片描述

在这里插入图片描述

  • 第二种方法:

搜索String.fromCharCode(a.charCodeAt(g)^b[(b[c]+b[d])%256]) 这段代码后面会有个return f;

在这里插入图片描述

在return f 前加上以下代码

// 注意了: 如果你是2022版本的话需要,将© 1998-2021 Northwoods Software 改成 © 1998-2022 Northwoods Software
// 这个你可以在水印上查看是哪个年限以及哪个版本:
if(f.indexOf(‘GoJS 2.1 evaluation’)>-1
|| f.indexOf(‘© 1998-2021 Northwoods Software’)>-1
|| f.indexOf(‘Not for distribution or production use’)>-1
|| f.indexOf(‘gojs.net’)>-1
){
return ‘’;
}else{
return f
}
  • 查看水印年限还有版本是2.1还是2.2的:
    在这里插入图片描述

  • 这个是加入后的图片(自己网上偷懒找的!)
    在这里插入图片描述

3.在vue中使用go.js
  • 使用案例Flowchart
  • 我们在初始化之前最好使用ref来设置 他的id属性
  • 我已经将他封装成为一个组件,具体注释代码里面也有,可以直接粘贴使用
  • 注意: 我改了不少原有的样式和结构,比如: Start我改成了长方形什么的,加了收缩功能
    在这里插入图片描述
<!--
 @description:Flowchart drawing, dedicated to customization
 @date:Created in  2022/7/24 15:55
 @modified By:luofei-create
 @version: 1.0.0
-->
<template>
  <div class="example">
    <div class="example-box" id="parentDiv">
       <!-- 主画布区域 -->
      <div ref="diagram" class="myDiagramDiv">
        <canvas
          class="canvas-left"
          tabindex="0"
          width="954"
          height="700">
          This text is displayed if your browser does not support the CanvasHTML element.
          </canvas>
        <div class="left-box">
          <div class="left-box-item"></div>
        </div>
      </div>
      <!-- 右边组件拖拽 -->
      <div ref="myPaletteDiv" class="myPaletteDiv" v-show="isRight">
        <canvas class="canvas-right"
          tabindex="0"
          width="560"
          height="700">
        </canvas>
        <div class="right-box">
          <div class="right-box-item">
            工具组件
          </div>
        </div>
      </div>

    </div>
  </div>
</template>

<script>
export default {
  name: 'example',
  data() {
    return {
      myDiagramRefs: null, //这个是为了将初始化的结构保存起来,可以调用go.js的方法
    };
  },
  props: {
  	//父组件传过来的json数据
    jsonData: {
      type: Object,
      require: true,
      default: () => ({}),
    },
    // 是否展示右侧的工具栏
    isRight: {
      type: Boolean,
      default: () => true,
    },
  },
  watch: {
    //监听json数据, 再次初始化
    jsonData: {
      handler(n, o) {
        this.load();
      },
    },
  },
  mounted() {
    //调用test方法,初始化画布
    this.test();
  },
  methods: {
    test() {
      // 初始化go.js
      const $ = go.GraphObject.make; // 为了定义模板的简洁性
      const myDiagram = $(
        go.Diagram,
        this.$refs.diagram,
        // 'my-diagram-div', // id挂载dome节点
        // 这里是控制那个菱形在连线的时候出现文字的,我暂时不需要,所以注释掉
        {
          // LinkDrawn: showLinkLabel,
          // LinkRelinked: showLinkLabel,
          'draggingTool.dragsTree': true,
          'undoManager.isEnabled': true, //是否可以粘贴复制等,delete建删除
        },
      );
      this.myDiagramRefs = myDiagram;
      // 当修改文档时,在标题中添加一个“*”,并启用“保存”按钮
      myDiagram.addDiagramListener('Modified', e => {
        const button = document.getElementById('SaveButton');
        if (button) button.disabled = !myDiagram.isModified;
        const idx = document.title.indexOf('*');
        if (myDiagram.isModified) {
          if (idx < 0) {
            myDiagram.layout = $(go.TreeLayout, { angle: 90 });
          }
        } else if (idx >= 0) document.title = document.title.slice(0, idx);
      });


      // 节点模板的Helper定义
      function nodeStyle() {
        return [
          // 节点。 location来自于节点数据的“loc”属性,由Point转换。 解析静态方法。
          // 如果节点。 location发生变化时,它更新节点数据的“loc”属性,并使用Point转换回来。 stringify静态方法。
          new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(
            go.Point.stringify,
          ),
          {
            // 这个节点位置位于每个节点的中心
            locationSpot: go.Spot.Center,
          },
        ];
      }
      // 定义一个用于创建通常是透明的“端口”的函数。
      function makePort(name, align, spot, output, input) {
        const horizontal = align.equals(go.Spot.Top) || align.equals(go.Spot.Bottom);
        return $(go.Shape, {
          fill: 'transparent',
          strokeWidth: 0,
          width: horizontal ? NaN : 8, // 如果不是水平拉伸,宽度只有8
          height: !horizontal ? NaN : 8, // 如果不是垂直拉伸,也就是8英尺高
          alignment: align, // 对齐主形状上的端口
          stretch: horizontal
            ? go.GraphObject.Horizontal
            : go.GraphObject.Vertical,
          portId: name, // 将此对象声明为“端口”
          fromSpot: spot, // 声明此端口的链接可能连接到哪里
          fromLinkable: output, // 声明用户是否可以从这里绘制链接 
          toSpot: spot, // 声明此端口的链接可能连接到哪里
          toLinkable: input, // 声明用户是否可以在此绘制链接 
          cursor: 'pointer', // 显示不同的游标以指示潜在的链接点 
          mouseEnter: (e, port) => {
            // PORT参数将是这个Shape
            if (!e.diagram.isReadOnly) port.fill = 'rgba(255,0,255,0.5)';
          },
          mouseLeave: (e, port) => (port.fill = 'transparent'),
        });
      }
      // 文字颜色
      function textStyle() {
        return {
          font: 'bold 11pt Lato, Helvetica, Arial, sans-serif',
          stroke: '#F8F8F8',
        };
      }
	 //这一句是我自己加上的,目的是为了在连线的时候可以帮我自动对齐
      myDiagram.layout = $(go.TreeLayout, { angle: 90 });

      // 定义普通节点的Node模板
      myDiagram.nodeTemplateMap.add(
        '', // 自己定义模板名称
        $(
          go.Node,
          'Spot',
          {
            resizable: true,
            resizeObjectName: 'SHAPE',
            selectionObjectName: 'SHAPE',
            margin: new go.Margin(10, 0, 10, 0),
          },
          nodeStyle(),
          // 主要对象是一个面板,它围绕着一个矩形形状的TextBlock 
          $(
            go.Panel,
            'Auto',
            $(
              go.Shape,
              'Rectangle',
              {
                name: 'SHAPE',
                fill: '#282c34',
                stroke: '#00A9C9',
                margin: new go.Margin(0, 0, 0, 0),
                strokeWidth: 1.5, // strokeWidh表示Step的盒子边框大小
              },
              new go.Binding('figure', 'figure'),
            ),
            $(
              go.TextBlock,
              textStyle(),
              {
                margin: 8,
                maxSize: new go.Size(560, NaN),
                wrap: go.TextBlock.WrapFit,
                editable: true,
              },
              new go.Binding('text').makeTwoWay(),
            ),
          ),
          //这里也是我自己加的,目的是为了可以像树一样可以收缩展开
          $('TreeExpanderButton',
            {
              margin: new go.Margin(0, 0, 0, 20),
              alignment: go.Spot.Bottom,
              alignmentFocus: go.Spot.Top,
            },
            { visible: true }),

          // 四个命名端口,每边一个:
          makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), //表示端口哪里可以链接,哪里不可以链接
          makePort('L', go.Spot.Left, go.Spot.LeftSide, true, true),
          makePort('R', go.Spot.Right, go.Spot.RightSide, true, true),
          makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false),
        ),
      );
      // 菱形的样式  -> 改成长方形
      myDiagram.nodeTemplateMap.add(
        'Conditional',
        $(
          go.Node,
          'Spot',
          {
            resizable: true,
            resizeObjectName: 'SHAPE',
            selectionObjectName: 'SHAPE',
          },
          nodeStyle(),
          $(
            go.Panel,
            'Auto',
            $(
              go.Shape,
              'Rectangle',
              {
                name: 'SHAPE',
                fill: '#282c34',
                stroke: 'rgba(98, 251, 243)',
                strokeWidth: 1.5,
              },
              new go.Binding('figure', 'figure'),
            ),
            $(
              go.TextBlock,
              textStyle(),
              {
                margin: 8,
                maxSize: new go.Size(560, NaN),
                wrap: go.TextBlock.WrapFit,
                editable: true,
              },
              new go.Binding('text').makeTwoWay(),
            ),
          ),
          $('TreeExpanderButton',
            { alignment: go.Spot.Bottom, alignmentFocus: go.Spot.Top },
            { visible: true }),
          // four named ports, one on each side:
          makePort('T', go.Spot.Top, go.Spot.TopCenter, false, true),
          makePort('L', go.Spot.Left, go.Spot.LeftCenter, true, true),
          makePort('R', go.Spot.Right, go.Spot.RightCenter, true, true),
          makePort('B', go.Spot.Bottom, go.Spot.BottomCenter, true, false),
        ),
      );
      // 圆形开始
      myDiagram.nodeTemplateMap.add(
        'Start',
        $(
          go.Node,
          'Spot',
          {
            resizable: true,
            resizeObjectName: 'SHAPE',
            selectionObjectName: 'SHAPE',
          },
          nodeStyle(),
          $(
            go.Panel,
            'Spot',
            $(
              go.Shape,
              'Rectangle', // 决定形状: Circle代表圆形,Rectangle代表正方形或者长方形,Diamond代表菱形
              {
                name: 'SHAPE',
                desiredSize: new go.Size(90, 40),
                fill: '#282c34',
                stroke: '#09d3ac',
                strokeWidth: 1.5,
              },
            ),
            $(
              go.TextBlock,
              'Start',
              textStyle(),
              {
                margin: 8,
                maxSize: new go.Size(360, NaN),
                wrap: go.TextBlock.WrapFit,
                editable: true,
              },
              new go.Binding('text').makeTwoWay(),
            ),
          ),
          $('TreeExpanderButton',
            { alignment: go.Spot.Bottom, alignmentFocus: go.Spot.Top },
            { visible: true }),
          // three named ports, one on each side except the top, all output only:
          makePort('T', go.Spot.Top, go.Spot.TopCenter, false, true),
          makePort('L', go.Spot.Left, go.Spot.LeftCenter, true, true),
          makePort('R', go.Spot.Right, go.Spot.RightCenter, true, true),
          makePort('B', go.Spot.Bottom, go.Spot.BottomCenter, true, false),
        ),
      );
      // 原型,结束样式
      myDiagram.nodeTemplateMap.add(
        'End',
        $(
          go.Node,
          'Table',
          nodeStyle(),
          {
            resizable: true,
            resizeObjectName: 'SHAPE',
            selectionObjectName: 'SHAPE',
          },
          $(
            go.Panel,
            'Spot',
            $(go.Shape, 'Circle', {
              desiredSize: new go.Size(60, 60),
              fill: '#282c34',
              stroke: '#DC3C00',
              strokeWidth: 3.5,
            }),
            $(go.TextBlock, 'End', textStyle(), new go.Binding('text')),
          ),
          $('TreeExpanderButton',
            { alignment: go.Spot.Bottom, alignmentFocus: go.Spot.Top },
            { visible: true }), // three named ports, one on each side except the bottom, all input only:
          makePort('T', go.Spot.Top, go.Spot.Top, false, true),
          makePort('L', go.Spot.Left, go.Spot.Left, false, true),
          makePort('R', go.Spot.Right, go.Spot.Right, false, true),
        ),
      );

      // taken from ../extensions/Figures.js:
      go.Shape.defineFigureGenerator('File', (shape, w, h) => {
        const geo = new go.Geometry();
        const fig = new go.PathFigure(0, 0, true); // starting point
        geo.add(fig);
        fig.add(new go.PathSegment(go.PathSegment.Line, 0.75 * w, 0));
        fig.add(new go.PathSegment(go.PathSegment.Line, w, 0.25 * h));
        fig.add(new go.PathSegment(go.PathSegment.Line, w, h));
        fig.add(new go.PathSegment(go.PathSegment.Line, 0, h).close());
        const fig2 = new go.PathFigure(0.75 * w, 0, false);
        geo.add(fig2);
        // The Fold
        fig2.add(new go.PathSegment(go.PathSegment.Line, 0.75 * w, 0.25 * h));
        fig2.add(new go.PathSegment(go.PathSegment.Line, w, 0.25 * h));
        geo.spot1 = new go.Spot(0, 0.25);
        geo.spot2 = go.Spot.BottomRight;
        return geo;
      });
      // 定义comment文本样式
      myDiagram.nodeTemplateMap.add(
        'Comment',
        $(
          go.Node,
          'Auto',
          nodeStyle(),
          $(go.Shape, 'File', {
            fill: '#282c34',
            stroke: '#DEE0A3',
            strokeWidth: 3,
          }),
          $(
            go.TextBlock,
            textStyle(),
            {
              margin: 8,
              maxSize: new go.Size(200, NaN),
              wrap: go.TextBlock.WrapFit,
              textAlign: 'center',
              editable: true,
            },
            new go.Binding('text').makeTwoWay(),
          ),
          // 没有端口,因为不允许链接连接注释 
        ),
      );

      //替换linkTemplateMap中默认的Link模板 
      myDiagram.linkTemplate = $(
        go.Link, // the whole link panel
        {
          routing: go.Link.AvoidsNodes,
          curve: go.Link.JumpOver,
          corner: 5,
          toShortLength: 4,
          relinkableFrom: true,
          margin: new go.Margin(10, 0, 10, 0),
          relinkableTo: true,
          reshapable: true,
          resegmentable: true,
          // mouse-overs subtly highlight links:
          mouseEnter: (e, link) => (link.findObject('HIGHLIGHT').stroke = 'rgba(30,144,255,0.2)'),
          mouseLeave: (e, link) => (link.findObject('HIGHLIGHT').stroke = 'transparent'),
          selectionAdorned: false,
        },
        new go.Binding('points').makeTwoWay(),
        $(
          go.Shape, // 高光形状,通常是透明的
          {
            isPanelMain: true,
            strokeWidth: 8,
            stroke: 'transparent',
            name: 'HIGHLIGHT',
          },
        ),
        $(
          go.Shape, // 链接路径形状,或者样式也可以设置
          { isPanelMain: true, stroke: 'gray', strokeWidth: 2 },
          new go.Binding('stroke', 'isSelected', sel => (sel ? 'dodgerblue' : 'gray')).ofObject(),
        ),
        $(
          go.Shape, // 箭头
          { toArrow: 'standard', strokeWidth: 0, fill: 'gray' },
        ),
        $(
          go.Panel,
          'Auto', //链接标签,通常不可见
          {
            visible: false,
            name: 'LABEL',
            segmentIndex: 2,
            segmentFraction: 0.5,
          },
          new go.Binding('visible', 'visible').makeTwoWay(),
          $(
            go.Shape,
            'RoundedRectangle', // 链接标签,通常不可见的标签形状 
            { fill: '#F8F8F8', strokeWidth: 0 },
          ),
          //这里是由于我不需要菱形那个形状,有需要的可以不用注释,还有连接线上的文字 Yes
          // $(
          //   go.TextBlock,
          //   'Yes',
          //   {
          //     textAlign: 'center',
          //     font: '10pt helvetica, arial, sans-serif',
          //     stroke: '#333333',
          //     editable: true,
          //   },
          //   new go.Binding('text').makeTwoWay(),
          // ),
        ),
      );

      // 如果链接来自“条件”节点,则使其可见。 
      // 这个监听器由“LinkDrawn”和“LinkRelinked”diagramevent调用。 
      function showLinkLabel(e) {
        const label = e.subject.findObject('LABEL');
        if (label !== null) label.visible = e.subject.fromNode.data.category === 'Conditional';
      }

      // LinkingTool和RelinkingTool使用的临时链接也是正交的: 
      myDiagram.toolManager.linkingTool.temporaryLink.routing = go.Link.Orthogonal;
      myDiagram.toolManager.relinkingTool.temporaryLink.routing = go.Link.Orthogonal;

      // 调用load???????????
      // 人造数据
      // this.load(myDiagram); // 从一些JSON文本加载一个初始图
      //启动初始化画布数据
      myDiagram.model = go.Model.fromJson(this.jsonData);
      
      const myPalette = $(
        go.Palette,
        this.$refs.myPaletteDiv, // must name or refer to the DIV HTML element
        {
          // Instead of the default animation, use a custom fade-down
          'animationManager.initialAnimationStyle': go.AnimationManager.None,
          InitialAnimationStarting: animateFadeDown, // Instead, animate with this function

          nodeTemplateMap: myDiagram.nodeTemplateMap, // share the templates used by myDiagram
          model: new go.GraphLinksModel([
            // specify the contents of the Palette
            { category: 'Start', text: '开始' },
            { Category: 'Assess', text: '业务组件' },
            { category: 'Conditional', text: '业务组件' },
            { category: 'End', text: '结束组件' },
            { category: 'Comment', text: 'Comment' },
          ]),
        },
      );

      // 这是默认动画的重新实现,只不过它是从向下淡入,而不是向上淡入。 
      function animateFadeDown(e) {
        const { diagram } = e;
        const animation = new go.Animation();
        animation.isViewportUnconstrained = true; // 因此,图表定位规则允许动画从屏幕外开始 
        animation.easing = go.Animation.EaseOutExpo;
        animation.duration = 900;
        //淡出“向下”,换句话说,从上面淡出 
        animation.add(
          diagram,
          'position',
          diagram.position.copy().offset(0, 200),
          diagram.position,
        );
        animation.add(diagram, 'opacity', 0, 1);
        animation.start();
      }
    },
    // 保存功能,我将数据传到父组件中
    save() {
      const data = this.myDiagramRefs.model.toJson();
      this.$emit('getJsonDataList', data); //导出数据
      this.myDiagramRefs.isModified = false;
    },
    // 初始化数据,形成画布
    load() {
      this.myDiagramRefs.model = go.Model.fromJson(this.jsonData);
      this.myDiagramRefs.isModified = true;
    },
    printDiagram() {
      const svgWindow = window.open();
      if (!svgWindow) return; // failure to open a new Window
      const printSize = new go.Size(700, 960);
      const bnds = myDiagram.documentBounds;
      let { x } = bnds;
      let { y } = bnds;
      while (y < bnds.bottom) {
        while (x < bnds.right) {
          const svg = myDiagram.makeSvg({
            scale: 1.0,
            position: new go.Point(x, y),
            size: printSize,
          });
          svgWindow.document.body.appendChild(svg);
          x += printSize.width;
        }
        x = bnds.x;
        y += printSize.height;
      }
      setTimeout(() => svgWindow.print(), 1);
    },
  },
};
</script>

<style scoped>
.example{
    margin-top: 5px;
}
.example-box{
    width: 100%;
    display: flex;
    justify-content: space-between;
}
.myPaletteDiv{
    width: 160px;
    background-color: rgb(24, 43, 133);
    position: relative;
    -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
}
.canvas-right{
    position: absolute;
    top: 0px;
    left: 0px;
    z-index: 2;
    user-select: none;
    touch-action: none;
    width: 160px;
    height: 700px;
    overflow: hidden;
}
.right-box{
    position: absolute;
    width: 160px;
    height: 700px;
    overflow: hidden;
    z-index: 1;
}
.right-box-item{
    position: absolute;
    width: 1px;
    height: 1px
}
/* 主画布区域 */
.myDiagramDiv{
    flex-grow: 1;
    height: 700px;
    margin-right: 2px;
    background-color: rgb(24, 43, 133);
    position: relative;
    -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
    cursor: auto;
}
.canvas-left{
    position: absolute;
    top: 0px;
    left: 0px;
    z-index: 2;
    user-select: none;
    touch-action: none;
    width: 954px;
    height: 700px;
    cursor: auto;
}
.left-box{
    position: absolute;
    width: 954px;
    height: 700px;
    z-index: 1;
}
.left-box-item{
    position: absolute; width: 1px; height: 1px
}
.text{
    color: rgba(255,0,255,0.5);
    background: #00A9C9;
}
</style>

二、加入的一些功能以及代码实现

1. 加入树形收缩节点
  • 代码片段
    在这里插入图片描述
  • 效果图:
    在这里插入图片描述
2.可收缩大小
  • 代码片段
    在这里插入图片描述

  • 效果图:
    在这里插入图片描述

样式什么的可以自己设置

三、翻译部分文档

一.按钮

为了您的方便,我们定义了几个常用的面板。 这些按钮包括"Button"、“TreeExpanderButton”、“SubGraphExpanderButton”、“PanelExpanderButton”、“ContextMenuButton"和"CheckBoxButton”。 "ContextMenuButton"通常在"ContextMenu"面板内使用; “复选框按钮”用于实现“复选框”面板。

在调用GraphObject.make时,可以像使用面板派生类一样使用这些预定义的面板。 它们被实现为面板中GraphObjects的简单可视化树,具有预先设置的属性和事件处理程序。

1.一般的按钮
diagram.nodeTemplate =
  $(go.Node, "Auto",
    { locationSpot: go.Spot.Center },
    $(go.Shape, "Rectangle",
      { fill: "gold" }),
    $(go.Panel, "Vertical",
      { margin: 3 },
      $("Button",
        { margin: 2,
          click: incrementCounter },
        $(go.TextBlock, "Click me!")),
      $(go.TextBlock,
        new go.Binding("text", "clickCount",
                       function(c) { return "Clicked " + c + " times."; }))
    )
  );

function incrementCounter(e, obj) {
  var node = obj.part;
  var data = node.data;
  if (data && typeof(data.clickCount) === "number") {
    node.diagram.model.commit(function(m) {
      m.set(data, "clickCount", data.clickCount + 1);
    }, "clicked");
  }
}

diagram.model = new go.GraphLinksModel(
  [ { clickCount: 0 } ]);

在这里插入图片描述

  • 按钮只是控制形状的面板,它将围绕着你所赋予的任何内容。 边界形状命名为“ButtonBorder”,以便您可以轻松设置或绑定其属性。
  • 由所有“Button”定义的事件处理程序使用了额外的属性,这些属性没有在API中定义,但你可以在“Button”的定义中看到:Buttons.js。 这些属性参数化按钮的外观。
diagram.nodeTemplate =
  $(go.Node, "Auto",
    { locationSpot: go.Spot.Center },
    $(go.Shape, "Rectangle",
      { fill: "gold" }),
    $(go.Panel, "Vertical",
      { margin: 3 },
      $("Button",
        {
          margin: 2,
          // 设置边框属性按钮的形状 
          "ButtonBorder.fill": "fuchsia",
          // 设置“按钮”本身事件处理程序使用的属性 
          "_buttonFillOver": "pink",
          click: function(e, button) { alert(button.findObject("ButtonBorder").fill); }
        },
        $(go.TextBlock, "fuchsia button\nwith pink highlight", { margin: 2, textAlign: "center" })
      ),
      $("Button",
        {
          margin: 2,
          // 设置边框属性按钮的形状 
          "ButtonBorder.figure": "Circle",
          "ButtonBorder.fill": "cyan",
          "ButtonBorder.stroke": "darkcyan",
          "ButtonBorder.strokeWidth": 3,
          // 设置“按钮”本身事件处理程序使用的属性 
          "_buttonFillOver": "white",
          "_buttonStrokeOver": "cyan",
          "_buttonFillPressed": "lightgray",
          click: function(e, button) { alert(button.findObject("ButtonBorder").stroke); }
        },
        $(go.TextBlock, "Circular\nbutton", { margin: 2, textAlign: "center" })
      ),
      $("Button",
        {
          margin: 2,
          click: function(e, button) { alert(button.findObject("PIC").source); }
        },
        // 按钮内容可以是任何东西——它不一定是一个TextBlock 
        $(go.Picture, "images/50x40.png", { name: "PIC", width: 50, height: 40 })
      ),
      $("Button",
        {
          margin: 2,
          // 按钮也可以通过设置或数据绑定禁用: 
          isEnabled: false,
          click: function(e, button) { alert("won't be alerted"); }
        },
        $(go.TextBlock, "disabled", { stroke: "gray" })
      )
    )
  );

diagram.model = new go.GraphLinksModel([ { } ]);

在这里插入图片描述

2.树扩展按钮 (TreeExpanderButtons)

这个也是我自己需要引入的按钮,上文已经介绍

扩展和折叠子树是很常见的。 通过在节点模板中添加“TreeExpanderButton”的实例,很容易让用户控制这一点。 该按钮调用CommandHandler。 collapseTree或CommandHandler。 expandTree取决于Node.isTreeExpanded的值。 按钮图标的形状。 图随节点值的变化而变化。 isTreeExpanded变化。

diagram.nodeTemplate =
  $(go.Node, "Spot",
    $(go.Panel, "Auto",
      $(go.Shape, "Rectangle",
        { fill: "gold" }),
      $(go.TextBlock, "Click small button\nto collapse/expand subtree",
        { margin: 5 })
    ),
    $("TreeExpanderButton",
      { alignment: go.Spot.Bottom, alignmentFocus: go.Spot.Top },
      { visible: true })
  );

diagram.layout = $(go.TreeLayout, { angle: 90 });

diagram.model = new go.GraphLinksModel(
  [ { key: 1 },
    { key: 2 } ],
  [ { from: 1, to: 2 } ] );

在这里插入图片描述

  • “TreeExpanderButton”是一个“按钮”,它持有一个显示“减线”或“增线”图形的形状,这取决于Node.isTreeExpanded的值。 该形状被命名为“ButtonIcon”,因此您可以轻松地设置或绑定它的属性,以及“ButtonBorder”和“Button”本身的属性。
diagram.nodeTemplate =
  $(go.Node, "Spot",
    $(go.Panel, "Auto",
      $(go.Shape, "Rectangle",
        { fill: "gold" }),
      $(go.TextBlock, "Click small button\nto collapse/expand subtree",
        { margin: 5 })
    ),
    $("TreeExpanderButton",
      {
        // set the two additional properties used by "TreeExpanderButton"
        // that control the shape depending on the value of Node.isTreeExpanded
        "_treeExpandedFigure": "TriangleUp",
        "_treeCollapsedFigure": "TriangleDown",
        // set properties on the icon within the border
        "ButtonIcon.fill": "darkcyan",
        "ButtonIcon.strokeWidth": 0,
        // set general "Button" properties
        "ButtonBorder.figure": "Circle",
        "ButtonBorder.stroke": "darkcyan",
        "_buttonStrokeOver": "darkcyan"
      },
      { alignment: go.Spot.Bottom, alignmentFocus: go.Spot.Top },
      { visible: true })
  );

diagram.layout = $(go.TreeLayout, { angle: 90 });

diagram.model = new go.GraphLinksModel(
  [ { key: 1 },
    { key: 2 } ],
  [ { from: 1, to: 2 } ] );

在这里插入图片描述

3.SubGraphExpanderButtons

还经常需要展开和折叠包含子图的组。 您可以通过向组模板添加“SubGraphExpanderButton”的实例来让用户控制这一点。 该按钮调用CommandHandler。 collapseSubGraph或CommandHandler。 expandSubGraph取决于Group.isSubGraphExpanded的值。 按钮图标的形状。 图随Group值的变化而变化。 isSubGraphExpanded变化。

diagram.groupTemplate =
  $(go.Group, "Auto",
    $(go.Shape, "Rectangle",
      { fill: "gold" }),
    $(go.Panel, "Vertical",
      { margin: 5,
        defaultAlignment: go.Spot.Left },
      $(go.Panel, "Horizontal",
        $("SubGraphExpanderButton",
          { margin: new go.Margin(0, 3, 5, 0) }),
        $(go.TextBlock, "Group")
      ),
      $(go.Placeholder)
    )
  );

diagram.model = new go.GraphLinksModel(
  [ { key: 0, isGroup: true },
    { key: 1, group: 0 },
    { key: 2, group: 0 },
    { key: 3, group: 0 } ] );

在这里插入图片描述

“SubGraphExpanderButton”类似于“TreeExpanderButton”,因为它是一个“按钮”,其边框形状围绕图标形状。 该形状被命名为“ButtonIcon”,因此您可以轻松地设置或绑定它的属性,以及“ButtonBorder”和“Button”本身的属性。

diagram.groupTemplate =
  $(go.Group, "Auto",
    $(go.Shape, "Rectangle",
      { fill: "gold" }),
    $(go.Panel, "Vertical",
      { margin: 5,
        defaultAlignment: go.Spot.Left },
      $(go.Panel, "Horizontal",
        $("SubGraphExpanderButton",
          {
            // 设置"SubGraphExpanderButton"使用的两个附加属性 
            // 根据Group.isSubGraphExpanded的值来控制形状 
            "_subGraphExpandedFigure": "TriangleUp",
            "_subGraphCollapsedFigure": "TriangleDown",
            // set other properties on the button icon
            "ButtonIcon.angle": -45,
            // 和按钮边框上的属性或按钮本身 
            "ButtonBorder.opacity": 0.0
          }),
        $(go.TextBlock, "Group")
      ),
      $(go.Placeholder)
    )
  );

diagram.model = new go.GraphLinksModel(
  [ { key: 0, isGroup: true },
    { key: 1, group: 0 },
    { key: 2, group: 0 },
    { key: 3, group: 0 } ] );

在这里插入图片描述

4.面板扩展按钮 (PanelExpanderButtons)

通常希望展开和折叠节点的一部分,从而显示或隐藏有时不需要的细节。 通过在节点模板中添加“PanelExpanderButton”的实例,很容易让用户控制这一点。 GraphObject的第二个参数。 make应该是一个字符串,用于命名节点中GraphObject. make的元素。 您希望按钮切换的可视属性。

diagram.nodeTemplate =
  $(go.Node, "Auto",
    $(go.Shape,
      { fill: "gold" }),
    $(go.Panel, "Table",
      { defaultAlignment: go.Spot.Top, defaultColumnSeparatorStroke: "black" },
      $(go.Panel, "Table",
        { column: 0 },
        $(go.TextBlock, "List 1",
          { column: 0, margin: new go.Margin(3, 3, 0, 3),
            font: "bold 12pt sans-serif" }),
        $("PanelExpanderButton", "LIST1",
          { column: 1 }),
        $(go.Panel, "Vertical",
          { name: "LIST1", row: 1, column: 0, columnSpan: 2 },
          new go.Binding("itemArray", "list1"))
      ),
      $(go.Panel, "Table",
        { column: 1 },
        $(go.TextBlock, "List 2",
          { column: 0, margin: new go.Margin(3, 3, 0, 3),
            font: "bold 12pt sans-serif" }),
        $("PanelExpanderButton", "LIST2",
          { column: 1 }),
        $(go.Panel, "Vertical",
          { name: "LIST2", row: 1, column: 0, columnSpan: 2 },
          new go.Binding("itemArray", "list2"))
      )
    )
  );

diagram.model = new go.GraphLinksModel([
  {
    key: 1,
    list1: [ "one", "two", "three", "four", "five" ],
    list2: [ "first", "second", "third", "fourth" ]
  }
]);

在这里插入图片描述

“PanelExpanderButton”类似于“TreeExpanderButton”或“SubGraphExpanderButton”,因为它是一个“按钮”,其边框形状围绕图标形状。 然而,此面板绑定形状。 几何字符串而不是Shape.figure。

diagram.nodeTemplate =
  $(go.Node, "Auto",
    $(go.Shape,
      { fill: "gold" }),
    $(go.Panel, "Table",
      { defaultAlignment: go.Spot.Top, defaultColumnSeparatorStroke: "black" },
      $(go.Panel, "Table",
        { column: 0 },
        $(go.TextBlock, "List 1",
          { column: 0, margin: new go.Margin(3, 3, 0, 3),
            font: "bold 12pt sans-serif" }),
        $("PanelExpanderButton", "LIST1",
          { column: 1,
            // 设置"PanelExpanderButton"使用的两个附加属性 
            // 根据GraphObject.visible的值来控制形状 
            // 命名为“LIST1”的对象的
            "_buttonExpandedFigure": "M0 0 L10 0",
            "_buttonCollapsedFigure": "M0 5 L10 5 M5 0 L5 10",
            "ButtonIcon.stroke": "blue",
            height: 16
          }),
        $(go.Panel, "Vertical",
          { name: "LIST1", row: 1, column: 0, columnSpan: 2 },
          new go.Binding("itemArray", "list1"))
      ),
      $(go.Panel, "Table",
        { column: 1 },
        $(go.TextBlock, "List 2",
          { column: 0, margin: new go.Margin(3, 3, 0, 3),
            font: "bold 12pt sans-serif" }),
        $("PanelExpanderButton", "LIST2",
          { column: 1,
            // 设置"PanelExpanderButton"使用的两个附加属性 
            // 根据GraphObject.visible的值来控制形状 
            //  命名为“LIST1”的对象的
            "_buttonExpandedFigure": "F M0 10 L5 0 10 10z",
            "_buttonCollapsedFigure": "F M0 0 L10 0 5 10z",
            "ButtonIcon.strokeWidth": 0,
            "ButtonIcon.fill": "blue"
          }),
        $(go.Panel, "Vertical",
          { name: "LIST2", row: 1, column: 0, columnSpan: 2 },
          new go.Binding("itemArray", "list2"))
      )
    )
  );

diagram.model = new go.GraphLinksModel([
  {
    key: 1,
    list1: [ "one", "two", "three", "four", "five" ],
    list2: [ "first", "second", "third", "fourth" ]
  }
]);

在这里插入图片描述

5.ContextMenuButtons和快捷菜单 (ContextMenuButtons and ContextMenus)

尽管您可以以任何您选择的方式实现上下文菜单,但通常使用预定义的“ContextMenuButton”。

diagram.nodeTemplate =
  $(go.Node, "Auto",
    $(go.Shape, "Rectangle",
      { fill: "gold" }),
    $(go.TextBlock, "Use ContextMenu!",
      { margin: 5 })
  );

diagram.nodeTemplate.contextMenu =
  $("ContextMenu",
    $("ContextMenuButton",
      $(go.TextBlock, "Shift Left"),
      { click: function(e, obj) { shiftNode(obj, -20); } }),
    $("ContextMenuButton",
      $(go.TextBlock, "Shift Right"),
      { click: function(e, obj) { shiftNode(obj, +20); } })
  );

function shiftNode(obj, dist) {
  var adorn = obj.part;
  var node = adorn.adornedPart;
  node.diagram.commit(function(d) {
    var pos = node.location.copy();
    pos.x += dist;
    node.location = pos;
  }, "Shift");
}

diagram.model = new go.GraphLinksModel(
  [ { key: 1 } ] );

在这里插入图片描述

“ContextMenuButton”只是一个设置了一些属性的“按钮”。 其中一个属性是GraphObject。 它被设置为go.GraphObject.Horizontal,这样“ContextMenu”中的所有“ContextMenuButton”都将被拉伸到相同的宽度。 但是你可以在它的“ButtonBorder”形状和按钮本身上设置所有常用的属性。

diagram.nodeTemplate =
  $(go.Node, "Auto",
    $(go.Shape, "Rectangle",
      { fill: "gold" }),
    $(go.TextBlock, "Use ContextMenu!",
      { margin: 5 })
  );

diagram.nodeTemplate.contextMenu =
  $("ContextMenu",
    $("ContextMenuButton",
      {
        "ButtonBorder.fill": "yellow",
        "_buttonFillOver": "cyan",
        "_buttonFillPressed": "lime"
      },
      $(go.TextBlock, "Shift Left"),
      { click: function(e, obj) { shiftNode(obj, -20); } }
    ),
    $("ContextMenuButton",
      {
        "ButtonBorder.fill": "yellow",
        "_buttonFillOver": "cyan",
        "_buttonFillPressed": "lime"
      },
      $(go.TextBlock, "Shift Right"),
      { click: function(e, obj) { shiftNode(obj, +20); } }
    ),
    $("ContextMenuButton",
      { isEnabled: false },
      $(go.TextBlock, "Shift Right", { stroke: "gray" }),
      { click: function(e, obj) { alert("won't be alerted"); } }
    )
  );

function shiftNode(obj, dist) {
  var adorn = obj.part;
  var node = adorn.adornedPart;
  node.diagram.commit(function(d) {
    var pos = node.location.copy();
    pos.x += dist;
    node.location = pos;
  }, "Shift");
}

diagram.model = new go.GraphLinksModel(
  [ { key: 1 } ] );

在这里插入图片描述

6.CheckBoxButtons和复选框(CheckBoxButtons and CheckBoxes)
  • “CheckBoxButton”是一个“按钮”,它被配置为切换数据属性的布尔值。 默认情况下,当值为false时按钮是清晰的,当值为true时显示一个复选标记,但是可以进行大量的定制。
  • 定义“CheckBoxButton”时的第一个参数应该是一个字符串,该字符串指定保存“CheckBoxButton”的已检查状态的数据属性。 如果不希望单击按钮来切换数据属性的值,请指定一个数据属性名称,该名称为空字符串。
  • 在“CheckBox”面板的定义中使用了“CheckBoxButton”,这是一种将任何GraphObject关联为“CheckBoxButton”标签的方便方式。
  • “复选框”示例中显示了许多具有各种自定义的“复选框”示例。
7.按钮的定义(Button Definitions)
  • 所有预定义按钮的实现都在Extensions目录下的buttons .js中提供。 在创建自己的按钮时,您可能希望复制并改编这些定义。
  • 这些定义可能不是GoJS中GraphObject.make使用的实际标准按钮实现的最新描述。
  • 注意,这些按钮的定义使用了GraphObject.defineBuilder静态函数。 它扩展了GraphObject的行为。 允许通过带有可选参数的名称创建相当复杂的可视树。 你可以在整个示例和扩展中找到各种控件的定义

后续

随缘更新翻译,大家如果需要,我会抽空把所有的文档翻译下来

(开源)基于vue, react, node.js, go开发的微商城(含微信小程序) 微商城地址: https://github.com/shen100/wemall 求star,求关注 项目截图微信小程序项目环境搭建1 克隆代码git clone https://github.com/shen100/wemall.git2 配置nginx 将wemall/nginx/dev.wemall.com.conf文件拷贝到nginx的虚拟主机目录下 3 配置hosts 127.0 阅读详情

相关推荐

使用Vue.js、React.js等前端技术构建高性能Golang桌面应用

Guark是一个专为桌面应用设计的现代前端框架,它汲取了现代Web开发的精华,提供了一套强大的组件化、模块化开发机制。在本章节,我们将介绍Guark的核心功能、设计理念以及为何它能在多样的操作系统上提供一致的体验。Framework7 是一个流行的开源框架,用于快速开发移动、桌面和Web应用程序。它为开发者提供了一套丰富的UI组件和工具,可以在各种设备和平台(包括 iOS、Android 和现代Web浏览器)上提供原生般的体验。

weixin_30336531的博客 863

vue中go.js的使用教学(四:模型及模板)

diagram.nodeTemplate = // 创建模板{ figure: "RoundedRectangle",//框类型fill: "white" }),//白色背景",//显示为hello//模板的数组//模板的线链接对象{ from: "Alpha", to: "Beta" }//从Alpha链接到Beta生成的图:节点尚未参数化 - 它们都是相同。

Blue54的博客 2171

gojs-chinese:gojs中文文档

GoJS中文文档欢迎提供PR 简介部分翻译进度 介绍 翻译状态 验证核对状态 基本 :check_mark_button: 建造 :check_mark_button: 使用模型 数据绑定 使用React的GoJ Angular的GoJ 文字区块 形状 图片 面板 桌子面板 毛刷 调整对象大小 项目数组 变更事件 交易次数 座标 初始视图 馆藏 链接 链接标签 港口 节点数 调试 版面 树木 子树 团体 子图 规模较大的团体 选拔 突出显示 动画片 工具提示 上下文菜单 图表事件 工具 指令 权限 验证 HTML互动 图层和Z顺序 调色板 概述 调整图表大小 更换和删除 纽扣 模板图 图例和标题 扩展名 几何弦 网格图案 分级面板 图表图像 SVG图 印刷 服务器端图像 Node.js中的GoJS 贮存 表现 :check_mark_button: 从源头建造 部署方式 API部分翻译进度 图形类 翻译状态 验证核对状态 装饰 :check_mark_button: 动画片 动画管理器 动画触发 命令处理程序

GOJS 基础用法

每个节点下方的内容会不同 这个时候就出现了节点这个概念。版本 网上去除这个版本水印的方法比较多。组样式 当在数据中 这行数据设置了。如果想去掉 左上角水印 可以下载。两个实例代码 放在最下面。比方做成官网这种动态线。则他使用的样式为下方。

notagoodwriter的博客 6425

gojs-react:一组React组件,用于管理GoJS图表,调色板和概述

gojsReact 由Northwoods Software for 该项目提供了用于图表,调色板和概述的React组件,以简化在React应用程序中GoJS的使用。 有关用法的示例,请参见;使用的更多信息。 有关这些组件实现的更多详细信息,请参见。 安装 gojs-react可以通过NPM安装或通过CDN使用。 该软件包对GoJS和React具有对等依赖关系,因此请确保它们也已安装或包含在您的页面中。 NPM npm install --save gojs-react CDN < script src =" https://unpkg.com/gojs-react/dist/gojsreact.production.min.js " > </ script > 用法 这个包提供了三个组件-ReactDiagram,ReactPalette和ReactOverview-与相关的GoJS

从零搭建医疗化验单识别系统:深度学习+OCR实战教程(附数据集)

本文详细介绍了如何从零开始构建一个医疗化验单智能识别系统。通过融合深度学习和OCR技术,系统能够应对版式多样、内容专业的医疗单据,实现从文本检测、识别到关键信息结构化抽取的全流程。文章提供了数据集处理、模型选型、训练微调及工程化部署的实战指南,并分享了避坑经验与性能优化策略,为开发者解决医疗信息化痛点提供了完整的技术方案。

k9l0m1的博客 492

Vue、React 和 Svelte 项目与 Golang Web 项目集成教程

Vue、React 和 Svelte 项目与 Golang Web 项目集成教程 1. 项目介绍 本项目是基于 Vite 的 Go 模块,旨在帮助开发者将 Vue 3、React 或 Svelte 项目与 Golang Web 项目进行集成。通过该模块,你可以轻松地将前端构建的结果服务于 Go 语言的 Web 服务器上。 2. 项目快速启动 安装 首先,你需要使用 ViteJS 的工具来处理你的 ...

gitblog_01196的博客 1217

通过HTTP的方式克隆GitHub上的项目

通过HTTP的方式克隆GitHub上的项目 打开想要下载的项目的网页链接,点击Clone or download绿色的按钮,进行如下步骤实现通过HTP的方式下载项目。 点击红色框圈出的位置: 打开想要存放项目的文件夹,在空白处点击鼠标右键,选择Git Bash Here,打开命令行。 输入git clone 复制的下载地址,回车进行下载。 4.正在下载的界面 5.下载完成。 技多不压身 哦耶✌✌✌ ...

weixin_37826412的博客 3201

wails Go+vue/angular/react编写桌面GUI客户端

最近公司需要做一个上传工具,因为上传的文件可能好几个G,所以用传统的http上传是很不现实的,大家就想着做成客户端,但是要跨平台,所以就进行技术选型,当时大家最先想到的就是electron,但是electron打出来的包很大,因为他把一个浏览器内核也给打包进去了。后来就想起了用go写,因为go也是跨平台的,然后百度找了几个,都是文档不全,偶然看到一个框架叫wails,而且这个相对于其他的几个还有个文档,关键是目前几大js框架都支持,wails是使用系统本身的系统内核,mac/linux使用的是webkit,

码农笔录-微信公众号博客 3219

Ubuntu20.04 安装 MATLAB R2023b 常见问题及解决方案

本文提供了Ubuntu20.04系统上安装MATLAB R2023b的完整指南,包括系统要求检查、依赖项安装、详细安装步骤及常见问题解决方案。特别针对GTK模块加载失败、OpenGL图形加速问题和中文显示乱码等常见问题提供了有效解决方法,帮助用户顺利完成安装并优化使用体验。

weixin_42619061的博客 483

无人机频谱侦测与智能识别技术实战解析

本文深入解析无人机频谱侦测与智能识别技术实战应用,涵盖无线电侦测、信号处理和定位技术等核心内容。通过频谱分析、特征提取和机器学习算法优化,实现高精度无人机识别与定位,并分享复杂环境下的应对策略和系统集成经验。

weixin_28419039的博客 488

Guark与React.js集成:构建高性能桌面应用的5个最佳实践

Guark是一个允许开发者使用现代Web技术(如React.js)构建桌面应用的框架,其后端逻辑由Go语言提供支持。通过Guark,你可以轻松地将React.js的前端界面与Go的强大后端功能相结合,打造出功能丰富、性能优异的桌面应用。 ## 1. 合理规划项目结构,实现前后端分离 在使用Guark与React.js集成开发桌面应用时,合理的项目结构是保证开发效率和代码可维护性的基础。建议将前

gitblog_00362的博客 360

2月底速申!国家超算互联网免费算力全攻略|编程小白零消耗实操首测_2026-02-26

2月底速申!国家超算互联网免费算力全攻略|编程小白零消耗实操首测作为一名编程小白,我目前正在学习编译和运行 Qt 框架,也在逐步摸索开发环境的配置方法,目标是打造一款属于自己的个人效率工具。就在这时,我挖到了一个国家级硬核福利:国家超算互联网核心节点开放免费试运行!哪怕是零基础如我,也能申领到 100 卡时异构加速卡算力,关键是——2 月底前申请更稳妥,早占位早使用。

qq_58517981的博客 2098

vite-go:Vue、React 或 Svelte 项目的 Go 服务器支持

vite-go:Vue、React 或 Svelte 项目的 Go 服务器支持 在现代web开发中,前端框架如Vue、React和Svelte与前端的构建工具如Vite的结合,为开发者提供了强大的开发体验和高效的构建流程。然而,将前端构建与后端服务集成时,可能会遇到一些挑战。vite-go正是为了解决这一问题而生,它是一个Go模块,允许你从基于Go的web服务器中服务你的Vue 3、React或S...

gitblog_00215的博客 300

全志Longan和Tina系统T113-S3-(Tina Linux 系统介绍)

Tina Linux是全志科技基于Linux内核开发的针对智能硬件类产品的嵌入式软件系统。Tina Linux基于openwrt-14.07 版本的软件开发包,包含了 Linux 系统开发用到的内核源码、驱动、工具、系统中间件与应用程序包。Tina系统软件架构如图所示。从下至上分别为Kernel && Driver、Libraries、System Services、Applications 四层。

szembed的博客 6331

内存设计指南:01 Xilinx DDR4 design guide解析

最近有很多网友咨询FPGA DDR4为什么速率总是上不去的问题,发现他们的设计确实很随意,都没有遵守一些手册的基本要求,所以今天和大家一起重新读一读DDR4 design guide,看看哪些要求是一定不能忽略的。首次设计一款新的芯片或者内存方案时,可能会无从下手。对于内存设计,官方指导首推JEDEC规范,每一代内存推出时,在JEDEC官网均能找到对应的规范文档、各种内存形式的说明文档如DDR4-JESD79、DDR4 SDRAM UDIMM Design Specification以及内存条DEMO等。

halee_00的博客 3302

Vue介绍和基本使用

Vue(读音/vjuː/,类似于view) 是一套用于构建用户界面的渐进式框架与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合MVVM 是的缩写,它是一种基于前端开发的架构模式,是一种事件驱动编程方式Model:vue对象的data属性里面的数据,这里的数据要显示到页面中View:vue中数据要显示的HTML页面,在vue中,也称之为“视图模板ViewModel。

m0_71115526的博客 1159

HBase在物流行业的应用:轨迹数据存储

想象一下,每天在全球范围内,数以亿计的物流包裹在各个城市、乡镇间穿梭。每一个包裹从发货人手中出发,经过仓储中心、转运站,最终到达收货人手中,这一路上都留下了它的“足迹”,也就是我们所说的轨迹数据。这些数据就像一个个拼图碎片,完整拼接起来后,能够清晰地呈现出整个物流网络的运行状况。例如,你在网上购买了一件心仪已久的商品,迫不及待地想知道它现在到哪儿了。物流平台实时更新的轨迹信息,让你可以准确了解包裹是在运输途中,还是已经到达附近的站点。

架构师的AI之路,分享AI应用开发架构的学习与实践。 965

Vue.js很好,但是比Angular或React更好吗?

In case you’ve never heard or used Vue.js before, you are probably thinking: Come on! yet another JavaScript framework! We get it. However, Vue.js is not new in the custom software development domai...

cullen2012的博客 396

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Guark框架入门指南:如何用Go和Vue.js快速构建跨平台桌面应用

你是否想要用Go语言开发桌面应用,但又不想放弃现代化的前端技术?Guark框架正是你需要的终极解决方案!这个强大的开源框架让你能够使用Go处理应用逻辑,同时用Vue.js、React.js等现代Web技术构建美观的用户界面。本文将为你提供完整的Guark框架入门教程,教你如何快速搭建跨平台桌面应用。🚀 ## 什么是Guark框架? Guark是一个创新的跨平台桌面应用开发框架,它将Go语言的

gitblog_01111的博客 760

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

vue.js react_React启发式的Vue.js样式指南生成器

vue.js react Vue JS组件样式指南生成器 (Vue js components styleguide generator) For purpose of having a demo of your Vuejs components please take a look at following projects that do really great job and are re...

cuk5340的博客 164

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Vue之基本使用

Vue介绍,特点, M-V-VM思想,引入方式,插值语法,文本指令,事件指令,属性指令 自动切换图片练习

weixin_47035302的博客 830

Gotron与主流前端框架集成:React、Vue.js和TypeScript完整示例指南 [特殊字符]

Gotron作为Go语言的Electron API封装工具,为开发者提供了将Go后端与现代化前端框架无缝集成的强大能力。本文将详细介绍如何将Gotron与React、Vue.js和TypeScript三大主流前端技术栈完美结合,打造跨平台桌面应用程序。 ## 为什么选择Gotron进行前端框架集成? 🤔 **Gotron** 是一个创新的Go语言库,它巧妙地将Electron的强大功能封装为

gitblog_01007的博客 428

JS获取地址栏参数的方法(原生、vue、angular、react)

若地址栏URL为:code-nav/article/917?type=12&title=abc,我们要获取到地址栏后面的的type和title参数,如何才能拿到呢?我们需要从地址code-nav/article/917?type=12&title=abc上拿到title的value abc。我们需要从地址code-nav/article/917上拿到917这个参数。接着就可以在home.vue组件中通过路由useRouter得到参数,注意是。如果文章对你有所帮助,

富朝阳的博客 1万+

Heat.js与主流框架集成:React、Angular和Vue的完美结合

Heat.js是一款高度可定制的JavaScript库,专为生成交互式热力图而设计。它能将复杂数据转化为流畅直观的热力图层,让用户轻松识别数据模式和强度。本文将详细介绍如何将Heat.js与React、Angular和Vue这三大主流前端框架无缝集成,帮助开发者快速构建专业级数据可视化应用。 ## 为什么选择Heat.js进行数据可视化? 在数据分析日益重要的今天,选择合适的可视化工具至关重要

gitblog_00352的博客 890

Vue.js vs React vs Angular

Vue.js vs React vs Angular

一行真人 547
上一篇: npm常用命令大全
下一篇: 聊一聊关于请求那些事儿
luofei_create
博客等级 码龄6年 3万+粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值