vis-network 知识点笔记

vis-network 是 vis.js 生态中专注于交互式网络拓扑图的库,支持节点与边的灵活配置、物理模拟、用户交互等功能,广泛用于关系图谱、流程图、拓扑结构可视化等场景。本文将从核心配置、常用方法、关键事件三个维度,梳理 vis-network 的实用知识点,帮助快速上手并灵活应用。

1. 核心配置:Options

Options 是初始化 vis-network 实例的核心参数,用于定义画布、节点、边、布局、交互等所有行为。以下是高频使用的配置模块及关键项(精简冗余配置,保留核心功能):

js 复制代码
const options = {
  autoResize: true, // 自动适配容器大小(默认true);为true时Network可以自动检测容器的大小,并进行相应地重绘;为false时Network则在容器调整大小之后,使用 redraw() 和 setSize() 函数强制重绘。
  height: '100%', // 画布高度(支持百分比/像素,如'500px')。默认值为'100%'。
  width: '100%', // 画布宽度
  locale: 'en', // 选择语言环境。默认情况下,语言是英语。默认值为'en'。
  // Locales对象. 默认支持 'en', 'de', 'es', 'it', 'nl' 'pt-br', 'ru' are supported. 请参阅下面的区域设置部分,了解如何自定义这些内容。
  locales: {
    en: {
      edit: 'Edit',
      del: 'Delete selected',
      back: 'Back',
      addNode: 'Add Node',
      addEdge: 'Add Edge',
      editNode: 'Edit Node',
      editEdge: 'Edit Edge',
      addDescription: 'Click in an empty space to place a new node.',
      edgeDescription: 'Click on a node and drag the edge to another node to connect them.',
      editEdgeDescription: 'Click on the control points and drag them to a node to connect to it.',
      createEdgeError: 'Cannot link edges to a cluster.',
      deleteClusterError: 'Clusters cannot be deleted.',
      editClusterError: 'Clusters cannot be edited.'
    }
  },
  clickToUse: false, // 是否需点击激活画布才响应交互(默认false,直接响应)。当 Network 配置为 clickToUse 时,它只在激活时对鼠标和触摸事件做出反应。当激活时,网络周围显示一个蓝色阴影边框。Network 通过单击设置为激活,通过单击Network外部或按ESC键将再次变为非激活。
  // 生成一个具有过滤功能的交互式选项编辑器。
  configure: {
    enabled: true, // 打开或关闭配置界面。这是一个可选参数。如果未定义,并且定义了此对象的任何其他属性,则将设置为true。
    /**
     * 类型:String, Array, Boolean, Function
     *  当一个布尔值为true时,它会给你所有的选项,false则不会显示任何选项。
     *  如果提供了字符串,则允许以下任意组合:节点、边、布局、交互、操纵、物理、选择、渲染器。随意想出一个有趣的分离角色。最后,当提供字符串数组时,可以接受前面提到的任何字段。
     *  提供函数时,您会收到两个参数。选项对象中的选项及其路径。如果返回true,则选项将显示在配置器中。例子:
     *    function (option, path) { return path.indexOf('physics') !== -1; } // 这只显示了物理选项。
     */
    filter: 'nodes,edges',
    container: undefined, // 类型:DOM element。这允许您将配置列表放在网络下方以外的另一个HTML容器中。
    showButton: true, // 显示配置器底部的生成选项按钮。默认值为true。
  },    
  // 处理edges的创建和删除,并包含全局的edges选项和样式。
  // 定义节点间连接的样式、箭头、平滑度等,与节点配置逻辑一致。
  edges: {
    // 箭头(to/middle/from三个方向)
    arrows: {
      to: {
        enabled: false,
        imageHeight: undefined,
        imageWidth: undefined,
        scaleFactor: 1,
        src: undefined,
        type: "arrow"
      },
      middle: {
        enabled: false,
        imageHeight: 32,
        imageWidth: 32,
        scaleFactor: 1,
        src: "https://visjs.org/images/visjs_logo.png",
        type: "image"
      },
      from: {
        enabled: false,
        imageHeight: undefined,
        imageWidth: undefined,
        scaleFactor: 1,
        src: undefined,
        type: "arrow"
      }
    },
    endPointOffset: {
      from: 0,
      to: 0
    },
    arrowStrikethrough: true,
    chosen: true,
    color: {
      color:'#848484',
      highlight:'#848484',
      hover: '#848484',
      inherit: 'from',
      opacity:1.0
    },
    dashes: false,
    font: {
      color: '#343434',
      size: 14, // px
      face: 'arial',
      background: 'none',
      strokeWidth: 2, // px
      strokeColor: '#ffffff',
      align: 'horizontal',
      multi: false,
      vadjust: 0,
      bold: {
        color: '#343434',
        size: 14, // px
        face: 'arial',
        vadjust: 0,
        mod: 'bold'
      },
      ital: {
        color: '#343434',
        size: 14, // px
        face: 'arial',
        vadjust: 0,
        mod: 'italic',
      },
      boldital: {
        color: '#343434',
        size: 14, // px
        face: 'arial',
        vadjust: 0,
        mod: 'bold italic'
      },
      mono: {
        color: '#343434',
        size: 15, // px
        face: 'courier new',
        vadjust: 2,
        mod: ''
      }
    },
    hidden: false,
    hoverWidth: 1.5,
    label: undefined,
    labelHighlightBold: true,
    length: undefined,
    physics: true,
    scaling:{
      min: 1,
      max: 15,
      label: {
        enabled: true,
        min: 14,
        max: 30,
        maxVisible: 30,
        drawThreshold: 5
      },
      customScalingFunction: function (min,max,total,value) {
        if (max === min) {
          return 0.5;
        }
        else {
          var scale = 1 / (max - min);
          return Math.max(0,(value - min)*scale);
        }
      }
    },
    selectionWidth: 1,
    selfReferenceSize: 20,
    selfReference:{
        size: 20,
        angle: Math.PI / 4,
        renderBehindTheNode: true
    },
    shadow:{
      enabled: false,
      color: 'rgba(0,0,0,0.5)',
      size:10,
      x:5,
      y:5
    },
    // 边的平滑度(默认true,动态弯曲)
    smooth: {
      enabled: true,
      type: "dynamic", // 平滑类型(dynamic/straight/curvedCW等)
      roundness: 0.5
    },
    title: undefined,
    value: undefined,
    width: 1,
    widthConstraint: false
  },
  // 处理nodes的创建和删除,并包含全局的nodes选项和样式。  
  // 定义节点的样式、外观、交互行为,支持全局配置或通过`groups`批量设置。
  nodes: {
    borderWidth: 1,
    borderWidthSelected: 2,
    brokenImage:undefined,
    chosen: true,
    // 颜色配置(普通/高亮/hover状态)
    color: {
      border: '#2B7CE9',
      background: '#97C2FC',
      highlight: {
        border: '#2B7CE9',
        background: '#D2E5FF'
      },
      hover: {
        border: '#2B7CE9',
        background: '#D2E5FF'
      }
    },
    opacity: 1,
    fixed: {
      x:false,
      y:false
    },
    // 文本样式
    font: {
      color: '#343434',
      size: 14, // px
      face: 'arial',
      background: 'none',
      strokeWidth: 0, // px
      strokeColor: '#ffffff',
      align: 'center',
      multi: false,
      vadjust: 0,
      bold: {
        color: '#343434',
        size: 14, // px
        face: 'arial',
        vadjust: 0,
        mod: 'bold'
      },
      ital: {
        color: '#343434',
        size: 14, // px
        face: 'arial',
        vadjust: 0,
        mod: 'italic',
      },
      boldital: {
        color: '#343434',
        size: 14, // px
        face: 'arial',
        vadjust: 0,
        mod: 'bold italic'
      },
      mono: {
        color: '#343434',
        size: 15, // px
        face: 'courier new',
        vadjust: 2,
        mod: ''
      }
    },
    group: undefined,
    heightConstraint: false,
    hidden: false,
    icon: {
      face: 'FontAwesome',
      code: undefined,
      weight: undefined,
      size: 50,  //50,
      color:'#2B7CE9'
    },
    image: undefined,
    imagePadding: {
      left: 0,
      top: 0,
      bottom: 0,
      right: 0
    },
    label: undefined, // 节点文本(可在数据中单独定义)
    labelHighlightBold: true,
    level: undefined,
    mass: 1,
    // 是否参与物理模拟(默认true,固定节点需设为false)
    physics: true,
    scaling: {
      min: 10,
      max: 30,
      label: {
        enabled: false,
        min: 14,
        max: 30,
        maxVisible: 30,
        drawThreshold: 5
      },
      customScalingFunction: function (min,max,total,value) {
        if (max === min) {
          return 0.5;
        }
        else {
          let scale = 1 / (max - min);
          return Math.max(0,(value - min)*scale);
        }
      }
    },
    shadow:{
      enabled: false,
      color: 'rgba(0,0,0,0.5)',
      size:10,
      x:5,
      y:5
    },
    shape: 'ellipse', // 节点形状(ellipse/circle/box/image/icon等)
    shapeProperties: {
      borderDashes: false, // only for borders
      borderRadius: 6,     // only for box shape
      interpolation: false,  // only for image and circularImage shapes
      useImageSize: false,  // only for image and circularImage shapes
      useBorderWithImage: false,  // only for image shape
      coordinateOrigin: 'center'  // only for image and circularImage shapes
    },
    size: 25, // 节点大小(默认25)
    title: undefined,
    value: undefined,
    widthConstraint: false,
    x: undefined,
    y: undefined,
  },        
  // 批量样式(groups):为不同分组的节点设置统一样式,避免重复配置(需在节点数据中指定`group`字段)。
  groups: {
    useDefaultGroups: true, // // 未知分组是否复用默认样式(默认true)。如果您的节点定义了不在"组"模块中的组,则该模块会循环使用它所定义的组,为每个未知组分配一个组。当所有这些都被使用时,它会回到第一组。通过将此设置为false,默认组将不会在此循环中使用。默认值为true。
    /*
      您可以添加多个组,这些组包含适用于特定子集的样式信息。节点模块中描述的所有有意义的选项都可以在这里使用(您不会为一组节点设置相同的id或x、y位置)。例子:
      var nodes = [
          {id:1, group:'myGroup', label:"I'm in a custom group called 'myGroup'!"}
      ]

      var options = {
        groups: {
          myGroup: {color:{background:'red'}, borderWidth:3}
        }
      }
      *)该选项不称为group,如示例所示,但可以通过任何自定义id,除了'useDefaultGroups'。
    */
    myGroupId:{
      /*node options*/
    },
    // 自定义分组(如"用户"节点)
    userGroup: {
      color: { background: '#FFC107', border: '#FF9800' },
      shape: 'box'
    },
    // 自定义分组(如"设备"节点)
    deviceGroup: {
      color: { background: '#4CAF50', border: '#388E3C' },
      shape: 'circle'
    },
  }, 
  // 布局配置(layout),控制节点的初始排列方式,支持普通布局和层级布局(如树形结构)。
  layout: {
    randomSeed: undefined, // 随机种子(固定值可复现相同布局)
    improvedLayout:true,
    clusterThreshold: 150,
    // 层级布局(默认禁用,适合树形结构)
    hierarchical: {
      enabled:false,
      levelSeparation: 150, // 层级间距
      nodeSpacing: 100,
      treeSpacing: 200,
      blockShifting: true,
      edgeMinimization: true,
      parentCentralization: true,
      direction: 'UD',        // 方向(UD:上下/DU:下上/LR:左右/RL:右左)
      sortMethod: 'hubsize',  // 排序方式(hubsize:按节点度数/directed:按方向)
      shakeTowards: 'leaves'  // roots, leaves
    }
  },  
  // 用户交互(interaction): 定义用户与画布的交互行为,如拖拽、缩放、选择等。
  interaction: {
    dragNodes:true, // 是否允许拖拽节点(默认true)
    dragView: true, // 是否允许拖拽画布(默认true)
    hideEdgesOnDrag: false,
    hideEdgesOnZoom: false,
    hideNodesOnDrag: false,
    hover: false, // 是否启用hover效果(默认false,需配合hoverNode事件)
    hoverConnectedEdges: true,
    keyboard: {
      enabled: false,
      speed: {x: 10, y: 10, zoom: 0.02},
      bindToWindow: true,
      autoFocus: true,
    },
    multiselect: false, // 是否允许框选多个节点(默认false)
    navigationButtons: false,
    selectable: true,
    selectConnectedEdges: true,
    tooltipDelay: 300, // tooltip延迟显示时间(毫秒)
    zoomSpeed: 1,
    zoomView: true, // 是否允许缩放画布(默认true)
  }, 
  // 提供改变Network中数据的API和可选GUI。
  manipulation: {
    enabled: false,
    initiallyActive: false,
    addNode: true,
    addEdge: true,
    editNode: undefined,
    editEdge: true,
    deleteNode: true,
    deleteEdge: true,
    controlNodeStyle: {
      // all node options are valid.
    }
  }, 
  // 物理模拟(physics): 控制节点的运动规则(如排斥力、引力),优化大规模网络的布局稳定性。
  physics: {
    enabled: true, // 是否启用物理模拟(默认true)
    // barnesHut求解器参数
    barnesHut: {
      theta: 0.5,
      gravitationalConstant: -2000, // 引力常数(负值为排斥,绝对值越大效果越强)
      centralGravity: 0.3,
      springLength: 95, // 弹簧长度(节点间的理想距离)
      springConstant: 0.04,
      damping: 0.09, // 阻尼(控制运动衰减速度,值越大越稳定)
      avoidOverlap: 0
    },
    forceAtlas2Based: {
      theta: 0.5,
      gravitationalConstant: -50,
      centralGravity: 0.01,
      springConstant: 0.08,
      springLength: 100,
      damping: 0.4,
      avoidOverlap: 0
    },
    repulsion: {
      centralGravity: 0.2,
      springLength: 200,
      springConstant: 0.05,
      nodeDistance: 100,
      damping: 0.09
    },
    hierarchicalRepulsion: {
      centralGravity: 0.0,
      springLength: 100,
      springConstant: 0.01,
      nodeDistance: 120,
      damping: 0.09,
      avoidOverlap: 0
    },
    maxVelocity: 50,
    minVelocity: 0.1,
    solver: 'barnesHut', // 求解器(barnesHut:大规模网络/repulsion:小规模)
    // 稳定化配置(避免节点持续运动)
    stabilization: {
      enabled: true,
      iterations: 1000, // 最大迭代次数(达到次数后停止模拟)
      updateInterval: 100,
      onlyDynamicEdges: false,
      fit: true
    },
    timestep: 0.5,
    adaptiveTimestep: true,
    wind: { x: 0, y: 0 }
  },      
}

2. 方法

2.1 全局方法

    1. destroy(): 销毁实例,移除DOM引用和事件绑定
    js 复制代码
    network.destroy();
    1. setData({nodes:vis DataSet/Array, edges:vis DataSet/Array}): 覆盖实例的所有数据(节点/边需为 vis.DataSet 或数组)。
    js 复制代码
    const newNodes = [{ id: 1, label: '新节点' }];
    const newEdges = [{ from: 1, to: 2, label: '连接' }];
    network.setData({ nodes: newNodes, edges: newEdges });
    1. setOptions(Object options): 动态更新配置(支持部分更新)
    js 复制代码
    network.setOptions({ nodes: { size: 30 } });
    1. on(String event name,Function callback):绑定事件监听器
    js 复制代码
    network.on('click', (params) => console.log(params));
    1. off(String event name,Function callback):移除事件监听器
    js 复制代码
    network.off('click', handleClick);
    1. once(String event name,Function callback):只设置一次事件侦听器。事件发生后,事件侦听器将被删除。根据事件的类型,回调函数会得到不同的参数。有关更多信息,请参阅文档的事件部分。

2.2 与画布相关的方法

    1. canvasToDOM({x:Number,y:Number}):这个函数将画布坐标转换为DOM上的坐标。输入和输出的形式为{x:Number,y:Number}。DOM值是相对于Network容器而言。
    1. DOMtoCanvas({x:Number,y:Number}) :这个函数将DOM上的坐标转换为画布坐标。输入和输出的形式为{x:Number,y:Number}。DOM值是相对于Network容器而言。
    1. redraw():重绘Network。
    1. setSize(String width,String height):设置画布的大小。这是在窗口调整大小时自动完成的。

2.3 布局

    1. getSeed():如果您喜欢您当前Network的布局,并且希望下次以同样的方式启动,请使用此方法请求Seed并将其放入layout.randomSeed选项中。

2.4 使用没有GUI的操纵系统的操纵方法。

    1. enableEditMode():以编程方式启用编辑模式。类似于按下编辑按钮的效果。
    1. disableEditMode():编程禁用编辑模式。类似于按下关闭图标(工具栏角落的小十字)的效果。
    1. addNodeMode():进入addNode模式。不需要启用编辑模式或操作。要摆脱这种模式,请调用disableEditMode()。handlerFunctions中定义的回调函数仍然适用。要在不使用操作GUI的情况下使用这些方法,请确保设置为false。
    1. editNode():编辑选定的节点。addNodeMode的解释也适用于此。
    1. addEdgeMode():进入addEdge模式。addNodeMode的解释也适用于此。
    1. editEdgeMode():进入editEdge模式。addNodeMode的解释也适用于此。
    1. deletedSelected():删除选中。不需要启用编辑模式或操作。

2.5 获取节点和边信息的方法

    1. getPositions([Array of nodeIds or nodeId]):获取节点的画布坐标(支持单个/多个节点)。
    • 返回具有所提供节点ID或节点ID的节点或节点组在画布空间中的x、y坐标,以对象形式呈现:
    js 复制代码
    // All nodes in the network.
    network.getPositions();
    >   {
          a123: { x: 5, y: 12 },
          b456: { x: 3, y: 4 },
          c789: { x: 7, y: 10 }
        }
    
    // Specific nodes.
    network.getPositions(['a123', 'b456']);
    >   {
          a123: { x: 5, y: 12 },
          b456: { x: 3, y: 4 },
        }
    
    // A single node.
    network.getPositions('a123');
    >   {
          a123: { x: 5, y: 12 }
        }
    • 示例
    js 复制代码
    // 获取节点1的坐标
    const pos = network.getPositions(1); // { 1: { x: 50, y: 80 } }
    1. getPosition(nodeId): 返回特定节点在画布空间中的x y位置。
    js 复制代码
    network.getPosition('a123');
    >   { x: 5, y: 12 }

    如果没有提供id,该方法将抛出 TypeError 如果提供的id与网络中的节点不对应,则该方法将抛出 ReferenceError。

    1. storePositions()
    • 当使用 vis.DataSet 将节点加载到网络中,此方法将所有节点的 X 和 Y 位置放入该数据集中。如果你从数据库加载节点,并将其与 DataSet 动态耦合,你可以使用它来稳定你的网络一次,然后通过 DataSet 保存该数据库中的位置,这样下次加载节点时,稳定几乎是即时的。
    • 如果节点仍在移动,并且您正在使用动态平滑边(默认情况下处于启用状态),则可以使用物理模块中的选项 stabilization.onlyDynamicEdges 来缩短初始化时间。
    • 此方法不支持聚类。目前,在使用聚类时无法缓存位置,因为它们不能仅从位置正确初始化。
    1. moveNode(nodeId, Number x, Number y):手动移动节点到指定画布坐标。
    js 复制代码
    // 移动节点1到(200, 200)
    network.moveNode(1, 200, 200);
    1. getBoundingBox(String node Id)
    • 返回节点的边界框,其中包含以下格式的标签:
    js 复制代码
    {
      top: Number,
      left: Number,
      right: Number,
      bottom: Number,
    }

    这些值位于画布空间中。

    1. getConnectedNodes(String nodeId or edgeId, [String direction])
    • 返回直接连接到此节点或边的所有节点的节点ID数组。
    • 对于节点id,返回一个数组,其中包含连接节点的id。
    • 如果可选参数 direction 设置为字符串 'from',则只返回父节点。
    • 如果 direction 设置为 'to',则只返回子节点。
    • 任何其他值或 undefined 都会返回父节点和子节点。
    • 对于边id,返回一个数组:[fromId,toId]。边的参数方向被忽略。
    1. getConnectedEdges(String nodeId):返回连接到此节点的边的edgeId数组。

2.6 控制模拟何时运行的物理方法

物理模拟控制:用于手动启停物理模拟,优化布局稳定性。

    1. startSimulation():启动物理模拟(默认自动启动,手动停止后需调用)。
    • 启动物理模拟。这通常在需要时进行,只有当自己停止模拟并希望在之后继续时才真正有用。
    1. stopSimulation():停止物理模拟(触发stabilized事件)。
    • 这将停止物理模拟并触发 stabilized 事件。可以通过拖动节点、更改数据集或调用 startSimulation() 来重新启动它。
    1. stabilize([iterations]):手动执行稳定化(快速优化布局,可选迭代次数)。

2.7 节点和边的选择方法

    1. getSelection()
    • 返回一个具有选定节点和边ID的对象,如下所示:
    js 复制代码
    {
      nodes: [Array of selected nodeIds],
      edges: [Array of selected edgeIds]
    }
    1. getSelectedNodes():获取当前选中的节点ID数组。
    js 复制代码
    const selected = network.getSelectedNodes(); // [1, 2]
    1. getSelectedEdges()
    • 返回一个选定边ID的数组,如下所示:[edgeId1, edgeId2, ..]
    1. getNodeAt({x: xPosition DOM, y: yPosition DOM})
    • 返回 nodeId 或 undefined。DOM位置预计为画布左上角的像素。
    1. getEdgeAt({x: xPosition DOM, y: yPosition DOM})
    • 返回edgeId或undefined。DOM位置预计为画布左上角的像素。
    1. selectNodes(Array with nodeIds,[Boolean highlightEdges]):选择指定节点(可选是否高亮关联边)。
    js 复制代码
    // 选择节点1和2,高亮关联边
    network.selectNodes([1, 2], true);
    • 选择与输入数组中的id对应的节点。如果 highlightEdges 为 true 或 undefined,则相邻边也将被选择。此方法在选择自己的对象之前取消选择所有其他对象。不引发事件。
    1. selectEdges(Array with edgeIds)
    • 选择与输入数组中的id对应的边。此方法在选择自己的对象之前取消选择所有其他对象。不引发事件。
    1. setSelection( Object selection, [Object options])
    • 设置选择,选择必须是这样的对象:
    js 复制代码
    {
      nodes: [Array of nodeIds],
      edges: [Array of edgeIds]
    }
    • 您还可以仅传递选择对象中的节点(nodes)或边(edges)。可用选项包括:
    js 复制代码
    {
      unselectAll: Boolean,
      highlightEdges: Boolean
    }
    1. unselectAll():取消选择所有对象,不引发事件。

2.8控制视口缩放和动画的方法

    1. getScale()
    • 返回网络的当前比例。1.0相当于100%,0无限缩小
    1. getViewPosition()
    • 以以下形式返回视图的当前中心焦点:{x:{Number},y:{Number}}
    1. fit([Object options]):缩放画布以显示所有节点(支持指定节点或缩放范围)。
    • 可以提供选项进行自定义:
    js 复制代码
    {
      nodes?: (string | number)[],
      minZoomLevel?: number,
      maxZoomLevel?: number,
      animation?: boolean | {
        duration?: number
        easingFunction?: string
      }
    }
    js 复制代码
    // 显示所有节点
    network.fit();
    // 仅显示节点1和2,最小缩放级别0.5
    network.fit({ nodes: [1, 2], minZoomLevel: 0.5 });
    1. focus( String nodeId, [Object options]):聚焦到指定节点(自动缩放并锁定视图)。
    js 复制代码
    {
      scale: Number,
      offset: {x:Number, y:Number}
      locked: boolean
      animation: { // -------------------> can be a boolean too!
        duration: Number
        easingFunction: String
      }
    }
    js 复制代码
    // 聚焦节点1,缩放级别2.0
    network.focus(1, { scale: 2.0 });

    下面的 moveTo() 描述中解释了除锁定之外的所有选项。锁定表示放大动画完成后,视图是否仍锁定到节点。默认值为true。options对象在focus方法中是可选的。

    1. moveTo(Object options):手动控制视图位置和缩放(支持动画)。
    • 选项包括:
    js 复制代码
    {
      position: {x:Number, y:Number},
      scale: Number,
      offset: {x:Number, y:Number}
      animation: { // -------------------> can be a boolean too!
        duration: Number
        easingFunction: String
      }
    }
    • 示例:
    js 复制代码
    network.moveTo({
      position: { x: 100, y: 100 }, // 画布中心位置
      scale: 1.5,                   // 缩放级别
      animation: { duration: 1000 } // 动画时长(毫秒)
    });

    位置(以画布为单位!)是相机中心焦点的位置。比例是目标缩放级别。默认值为1.0。偏移量(以DOM为单位)是视图从中心聚焦的像素数。默认值为{x:0,y:0}。对于动画,可以使用布尔值将其与默认选项一起使用,也可以禁用它,或者可以手动定义持续时间(以毫秒为单位)和缓解功能。可用的有:linear, easeInQuad, easeOutQuad, easeInOutQuad, easeInCubic, easeOutCubic, easeInOutCubic, easeInQuart, easeOutQuart, easeInOutQuart, easeInQuint, easeOutQuint, easeInOutQuint。必须至少定义一个比例、位置或偏移。否则,就没有什么可转移的了。

    1. releaseNode():以编程方式释放焦点节点。

2.9 与配置器模块一起使用的方法

    1. getOptionsFromConfigurator()
    • 如果使用配置器,可以调用此方法来获取一个选项对象,该对象包含用户与配置器交互导致的与默认选项的所有差异。

2.10 集群方法选项对象

提供给集群函数的选项对象可以包含以下属性:

    1. joinCondition( nodeOptions: Object) 或 joinCondition( parentNodeOptions: Object, childNodeOptions: Object)
    • 除集群方法外,其他方法都是可选的。
    • clusterByConnection 是唯一一个将2个 nodeOptions 对象作为参数传递给 joinCondition 回调的函数。
    • 集群模块循环选择集群中的所有节点,并使用它们的数据作为参数调用此函数。如果此函数返回 true,则此节点将被添加到集群中。您可以访问所有选项(包括默认选项)以及您可能添加到节点的任何自定义字段,以确定是否将其包含在集群中。例子:
    js 复制代码
    var nodes = [
      {id: 4, label: 'Node 4'},
      {id: 5, label: 'Node 5'},
      {id: 6, label: 'Node 6', cid:1},
      {id: 7, label: 'Node 7', cid:1}
    ]
    
    var options = {
      joinCondition:function(nodeOptions) {
        return nodeOptions.cid === 1;
      }
    }
    
    network.clustering.cluster(options);

    clusterByConnection 将2个 nodeOptions 对象作为参数传递给 joinCondition 回调函数。

    1. processProperties(clusterOptions: Object, childNodesOptions: Array, childEdgesOptions: Array)
    • 可选。在创建新的集群节点之前,将使用您提供的属性(clusterNodeProperties)、所有包含的节点和所有包含的边调用此(可选)函数。您可以使用此功能根据集群包含的项目更新集群的属性。该函数应返回属性以创建集群节点。在下面的例子中,我们确保在形成集群时保持质量和价值:
    js 复制代码
    var options = {
      processProperties: function (clusterOptions,
          childNodes, childEdges) {
        var totalMass = 0;
        var totalValue = 0;
        for (var i = 0; i < childNodes.length; i++) {
          totalMass += childNodes[i].mass;
          totalValue = childNodes[i].value
            ? totalValue + childNodes[i].value
            : totalValue;
        }
        clusterOptions.mass = totalMass;
        if (totalValue > 0) {
          clusterOptions.value = totalValue;
        }
        return clusterOptions;
      },
    }
    1. clusterNodeProperties
    • 可选。这是一个包含群集节点选项的对象。节点模块中描述的所有选项都是允许的。这允许您以任何方式设置集群节点的样式。这也是 processProperties 函数中提供的用于微调的样式对象。如果未定义,将使用默认节点选项。
    • 默认功能仅在集群包含2个或更多节点时才允许集群。要允许对单个节点进行集群,可以使用 allowSingleNodeCluster: true 属性。
    js 复制代码
    clusterNodeProperties: {
      allowSingleNodeCluster: true
    }
    1. clusterEdgeProperties
    • 可选。这是一个包含连接到集群的边的选项的对象。允许使用边缘模块中描述的所有选项。使用此功能,您可以按任何方式设置连接到集群的边的样式。如果没有提供,则使用被替换的边上的选项。如果未定义,将使用默认边选项。

3. Events

3.1 由人机交互、选择、拖动等触发的事件

    1. click: 点击画布时触发(返回点击的节点/边、坐标等信息)。
    js 复制代码
    {
      nodes: [Array of selected nodeIds],
      edges: [Array of selected edgeIds],
      event: [Object] original click event,
      pointer: {
        DOM: {x:pointer_x, y:pointer_y},
        canvas: {x:canvas_x, y:canvas_y}
      }
    }

    这是所有事件的共同结构。针对单击事件,添加了以下属性:

    js 复制代码
    {
      ...
      items: [Array of click items],
    }

    点击项目可以是:

    js 复制代码
    {nodeId:NodeId}            // node with given id clicked on
    {nodeId:NodeId labelId:0}  // label of node with given id clicked on
    {edgeId:EdgeId}            // edge with given id clicked on
    {edge:EdgeId, labelId:0}   // label of edge with given id clicked on

    items 数组的顺序按 z-order 递减。因此,要获取最顶部的项,请获取索引0处的值。

    • 示例;
    js 复制代码
    network.on('click', (params) => {
      // 点击节点时打印节点ID
      if (params.nodes.length > 0) {
        console.log('点击节点:', params.nodes[0]);
      }
    });
    1. doubleClick
    • 当用户双击鼠标或在触摸屏设备上双击时触发。由于双击实际上是2次点击,因此会触发2次点击事件,然后是双击事件。如果在触发双击事件时不想使用单击事件,只需在处理它们之前检查单击事件之间的时间。
    1. oncontext
    • 当用户用鼠标右键单击画布时触发。默认情况下,鼠标右键不选择。如果需要,可以使用 getNodeAt 方法选择节点。
    1. hold
    • 当用户点击并按住鼠标或在触摸屏设备上点击并按住时触发。在这种情况下,还会触发一个点击事件。
    1. release:画布上的绘画完成后发射。可用于在网络上绘图。
    1. select:选择状态变化时触发(返回当前选中的节点/边)。
    1. selectNode:当用户选择节点时触发。
    1. selectEdge:当用户选择边时触发。
    1. deselectNode
    • 当用户取消选择一个或多个节点时触发。上一个选择是在上次用户事件之前选择的节点和边的列表。传递具有以下结构的属性的对象:
    js 复制代码
    {
      nodes: [Array of selected nodeIds],
      edges: [Array of selected edgeIds],
      event: [Object] original click event,
      pointer: {
        DOM: {x:pointer_x, y:pointer_y},
        canvas: {x:canvas_x, y:canvas_y}
      },
      previousSelection: {
        nodes: [Array of previously selected nodeIds],
        edges: [Array of previously selected edgeIds]
      }
    }
    1. deselectEdge
    • 当用户取消选择一个或多个边时触发。上一个选择是在上次用户事件之前选择的节点和边的列表。
    1. dragStart:开始拖动时被触发。
    1. dragging: 拖动节点或视图时触发。
    1. dragEnd:拖动完成后触发。
    1. controlNodeDragging
    • 拖动控制节点时触发。Control Edge 是正在拖动的边,包含'from'和'to'节点的id。若控制节点未拖动到另一个节点上,则'to'字段未定义。传递具有以下结构的属性的对象:
    js 复制代码
    {
      nodes: [Array of selected nodeIds],
      edges: [Array of selected edgeIds],
      event: [Object] original click event,
      pointer: {
          DOM: {x:pointer_x, y:pointer_y},
          canvas: {x:canvas_x, y:canvas_y}
      },    
      controlEdge: {from:from_node_id, to:to_node_id}
    }
    1. controlNodeDragEnd:控制节点拖动完成后触发。
    1. hoverNode
    • 如果启用了选项 interaction: {hover:true} 并且鼠标悬停在节点上,则触发。
    1. blurNode
    • 如果启用了选项 interaction:{hover:true} ,并且鼠标从之前悬停的节点移开,则触发。
    1. hoverEdge
    • 如果启用了选项 interaction:{hover:true} 并且鼠标悬停在边缘上,则触发。
    1. blurEdge
    • 如果启用了选项 interaction:{hover:true} ,并且鼠标从之前悬停的边缘移开,则触发。
    1. zoom:缩放画布时触发(返回缩放方向和当前缩放级别)。
    • 当用户放大或缩小时触发。这些属性告诉你缩放的方向。缩放是一个大于0的数字,这与使用 network.getScale() 得到的数字相同。当通过单击放大或缩小导航按钮触发时,传递的对象的指针属性将为 null。传递具有以下结构的属性的对象:
    js 复制代码
    {
      direction: '+'/'-',
      scale: Number,
      pointer: {x:pointer_x, y:pointer_y}
    }
    1. showPopup:显示弹出窗口(工具提示)时触发。
    1. hidePopup:当弹出窗口(工具提示)隐藏时触发。

3.2 事件触发了物理模拟。可用于触发GUI更新

    1. startStabilizing
    • 稳定开始时触发。当您拖动节点并重新启动物理模拟以再次稳定时,也会出现这种情况。稳定并不一定意味着"不表现"。
    1. stabilizationProgress:稳定化过程中触发(返回进度,用于显示加载条)。
    • 当达到 updateInterval 迭代次数的倍数时触发。这只发生在"隐藏"的稳定中。传递具有以下结构的属性的对象:
    js 复制代码
    {
      iterations: Number // iterations so far,
      total: Number      // total iterations in options
    }
    1. stabilizationIterationsDone
    • 当"隐藏"稳定功能完成时触发。这并不一定意味着网络是稳定的;这也可能意味着已经达到选项中定义的迭代次数。
    1. stabilized:物理模拟稳定或手动停止时触发(返回迭代次数)。
    • 当网络稳定或调用 stopSimulation() 时触发。它所花费的迭代量可用于调整稳定网络所需的最大迭代量。传递一个具有以下结构的属性的对象:
    js 复制代码
    {
      iterations: Number // iterations it took
    }
    js 复制代码
    network.on('stabilized', (params) => {
      console.log('布局稳定,迭代次数:', params.iterations);
    });

3.3 画布触发的事件

    1. resize:画布大小变化时触发(用于适配窗口 resize 事件)。
    • 当画布的大小被调整时触发,可以通过容器div大小改变时的重绘调用、具有新值的 setSize() 调用或具有新宽度和/或高度值的 setOptions() 调用。传递具有以下结构的属性的对象:
    js 复制代码
    {
      width: Number     // the new width  of the canvas
      height: Number    // the new height of the canvas
      oldWidth: Number  // the old width  of the canvas
      oldHeight: Number // the old height of the canvas
    }

3.4 渲染模块触发的事件。可用于在画布上绘制自定义元素

    1. initRedraw
    • 在重新绘制开始前被解雇。此时模拟步骤已完成。可用于在开始绘制新框架之前移动自定义元素。
    1. beforeDrawing:绘制节点/边前触发(可在画布底层绘制自定义内容)。
    • 在画布被清除、缩放并平移到查看位置后,但在绘制所有边和节点之前触发。可用于在网络后面绘制。
    1. afterDrawing:绘制节点/边后触发(可在画布顶层绘制自定义内容)。

3.5 视图模块触发的事件

    1. animationFinished:动画完成时触发

3.6 配置模块触发的事件

    1. configChange
    • 当用户更改配置器中的任何选项时触发。options 对象可以与 setOptions 方法一起使用,也可以使用 JSON.stringify() 进行字符串化。您不必手动将选项放入网络:这是自动完成的。您可以使用该事件将用户选项存储在数据库中。
相关推荐
有点笨的蛋2 小时前
重新理解 Flexbox:让布局回归“弹性”的本质
前端·css
小着3 小时前
微信小程序组件中二维码生成问题解决方案
前端·微信小程序
潜心编码3 小时前
基于Django的医疗电子仪器系统
前端·数据库·1024程序员节
你说啥名字好呢3 小时前
【React的Fiber及中断-重启逻辑的设计】
javascript·react.js
摘星编程3 小时前
深入 Actix-web 源码:解密 Rust Web 框架的高性能内核
开发语言·前端·rust·actixweb
小白的码BUG之路3 小时前
Vue3 -- 响应式 ref和 reactive
前端·javascript·vue.js
Onion3 小时前
Vue2日历组件-仿企微日程日历
前端·javascript·vue.js
用户84298142418103 小时前
js中如何隐藏eval关键字?
前端·javascript·后端
chxii3 小时前
前端与Node.js
前端·node.js