vue3.0+vis.js网络拓扑图点击节点的展开与收缩

自己学习所写,不是很标准,但是功能已经实现了,记录一下!

1.npm安装vis.js

npm install vis

2.在页面引入vis的DataSet和Network

import { DataSet, Network } from "vis";

3.在html中定义一个容器

<div id="mynetwork"></div>

//css样式可自定义
<style>
 #mynetwork {
    width: 1000px;
    height: 500px;
    margin: 0 auto;
    border: 1px solid lightgray;
    canvas {
      cursor: pointer;
    }
  }
</style>

  4.完整代码

<template>
    <div class="app">
        <div id="mynetwork"></div>
    </div>
</template>

<script>
import { DataSet, Network } from "vis";
import { ElMessage } from "element-plus";

export default{
    setup(){
        const init = () => {
          //定义需要生成的节点
          var allnodes = [
            {
              id: 1,
              label: "tnt",
              pid: 0,
              subids: [2, 9]
            },
            { id: 2, label: "刘耀文", pid: 1, subids: [3, 5] },
            {
              id: 3,
              label: "文文",
              pid: 2,
              subids: [4]
            },
            { id: 4, label: "宋亚轩", pid: 3 },
            {
              id: 5,
              label: "轩轩",
              pid: 2,
              subids: [7, 6]
            },
            { id: 6, label: "狼崽", pid: 5 },
            {
              id: 7,
              label: "狼王",
              pid: 5,
              subids: [8]
            },
            { id: 8, label: "小刘", pid: 7 },
            {
              id: 9,
              label: "吻文",
              pid: 1,
              subids: [10, 11]
            },
            { id: 10, label: "tyt", pid: 9 },
            {
              id: 11,
              label: "时代少年团",
              pid: 9,
              subids: [12, 13]
            },
            { id: 12, label: "长江国际", pid: 11 },
            {
              id: 13,
              label: "丁程鑫",
              pid: 11,
              subids: [14]
            },
            { id: 14, label: "18楼", pid: 13 }
          ];
          //定义节点连接线
          var alledges = [
            { id: "1_2", from: 1, to: 2 },
            { id: "2_3", from: 2, to: 3 },
            { id: "2_5", from: 2, to: 5 },
            { id: "3_4", from: 3, to: 4 },
            { id: "5_6", from: 5, to: 6 },
            { id: "5_7", from: 5, to: 7 },
            { id: "7_8", from: 7, to: 8 },
            { id: "1_9", from: 1, to: 9 },
            { id: "9_10", from: 9, to: 10 },
            { id: "9_11", from: 9, to: 11 },
            { id: "11_12", from: 11, to: 12 },
            { id: "11_13", from: 11, to: 13 },
            { id: "13_14", from: 13, to: 14 }
          ];
          // 创建节点对象
          var nodes = new DataSet(allnodes);
          // 创建连线对象
          var edges = new DataSet(alledges);
          // 创建一个网络拓扑图
          var container = document.getElementById("mynetwork");
          var data = { nodes: nodes, edges: edges };
          var options = {
            interaction: {
              hover: true,
              hoverConnectedEdges: true
            },
            // 节点样式
            nodes: {
              font: {
                color: "white", //字体的颜色
                size: 16 //显示字体大小
              },
              shape: "image",
              image: require("@/assets/images/icon.png")
            },
            //连接线的样式
            edges: {
              color: {
                color: "#43CEB1",
                highlight: "#43CEB1",
                hover: "green",
                inherit: "from",
                opacity: 1.0
              },
              font: {
                align: "top" //连接线文字位置
              }
            }
          };
          var network = new Network(container, data, options);

          var nodes_data = network.body.data.nodes._data;
          network.on("doubleClick", function(params) {
            //双击事件
            if (params.nodes.length != 0) {
              //确定为节点双击事件
              var click_node_id = params.nodes[0];
              remove_all_sub_nodes(click_node_id);
            }
          });

          //删除下级所有节点
          function remove_all_sub_nodes(node_id) {
            var sub_nodes = get_directly_sub_nodes(node_id);
            if (sub_nodes.length == 0) {
              //当前点击的为叶子节点
              //判断是否有下级节点
              if (typeof allnodes[node_id - 1]["subids"] != "undefined") {
                $.each(allnodes[node_id - 1]["subids"], function(index, item) {
                  nodes.add(allnodes[item - 1]);
                  edges.add({ id: node_id + "_" + item, from: node_id, to: item });
                });
              } else {
                ElMessage("当前为叶子节点");
              }
            } else {
              $.each(sub_nodes, function(index, item) {
                var sub_sub_nodes = get_directly_sub_nodes(item);
                if (sub_sub_nodes.length == 0) {
                  nodes.remove({ id: item });
                  edges.remove({ id: node_id + "_" + item });
                } else {
                  remove_all_sub_nodes(item);
                }
                nodes.remove({ id: item });
                edges.remove({ id: node_id + "_" + item });
              });
            }
          }

          //获取某节点直属下级节点
          function get_directly_sub_nodes(node_id) {
            var return_nodes = [];
            var connectedNodes = network.getConnectedNodes(node_id); //获取所有连接节点
            $.each(connectedNodes, function(index, item) {
              if (item != allnodes[node_id - 1]["pid"]) {
                //当前节点的父节点 ,不操作
                return_nodes.push(item);
              }
            });
            return return_nodes;
          }
        }
    };
    return {
      init
    };
    mounted() {
        this.init();
    }
}
</script>

参考:https://blog.csdn.net/qq_36509946/article/details/108533115

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值