vue3.0 + D3.js 实现拓扑绘图

这篇具有很好参考价值的文章主要介绍了vue3.0 + D3.js 实现拓扑绘图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vue 拓扑图组件,javascript,vue.js,前端

 

1. 首先,在项目中安装 D3.js 和 Vue 3.0:

npm install d3@^7.0.0
npm install vue@^3.0.0

2. Vue组件中引入 D3.js

import * as d3 from 'd3';

3. 在 Vue 组件中定义一个 data 对象,用于存储拓扑结构的节点和边:

data() {
  return {
    nodes: [
      {id: 1, name: 'Node 1'},
      {id: 2, name: 'Node 2'},
      {id: 3, name: 'Node 3'}
    ],
    links: [
      {source: 1, target: 2},
      {source: 1, target: 3}
    ]
  }
}

4. 在 Vue 组件的 mounted 生命周期中使用 D3.js 绘制拓扑结构:

mounted() {
  const svg = d3.select('#topology');
  const width = svg.attr('width');
  const height = svg.attr('height');

  const simulation = d3.forceSimulation(this.nodes)
    .force('link', d3.forceLink(this.links).id(d => d.id))
    .force('charge', d3.forceManyBody())
    .force('center', d3.forceCenter(width / 2, height / 2));

  const link = svg.selectAll('line')
    .data(this.links)
    .enter()
    .append('line')
    .attr('stroke', '#ccc')
    .attr('stroke-width', 1);

  const node = svg.selectAll('circle')
    .data(this.nodes)
    .enter()
    .append('circle')
    .attr('r', 10)
    .attr('fill', 'blue')
    .call(d3.drag()
      .on('start', dragstarted)
      .on('drag', dragged)
      .on('end', dragended));

  node.append('title')
    .text(d => d.name);

  simulation.on('tick', () => {
    link
      .attr('x1', d => d.source.x)
      .attr('y1', d => d.source.y)
      .attr('x2', d => d.target.x)
      .attr('y2', d => d.target.y);

    node
      .attr('cx', d => d.x)
      .attr('cy', d => d.y);
  });

  function dragstarted(event, d) {
    if (!event.active) simulation.alphaTarget(0.3).restart();
    d.fx = d.x;
    d.fy = d.y;
  }

  function dragged(event, d) {
    d.fx = event.x;
    d.fy = event.y;
  }

  function dragended(event, d) {
    if (!event.active) simulation.alphaTarget(0);
    d.fx = null;
    d.fy = null;
  }
}

5. 在 Vue 组件的 template 中添加一个 SVG 元素用于显示拓扑结构:

<template>
  <div>
    <svg id="topology" width="600" height="400"></svg>
  </div>
</template>

 完整代码实现文章来源地址https://www.toymoban.com/news/detail-648072.html

<template>
  <div>
    <svg id="topology" width="600" height="400"></svg>
  </div>
</template>

<script>
import * as d3 from 'd3';

export default {
  name: "topology",
  data() {
    return {
      nodes: [
        {id: 1, name: 'Node 1'},
        {id: 2, name: 'Node 2'},
        {id: 3, name: 'Node 3'},
        {id: 4, name: 'Node 4'}
      ],
      links: [
        {source: 1, target: 2},
        {source: 1, target: 3},
        {source: 1, target: 4}
      ]
    }
  },
  mounted() {
    const svg = d3.select('#topology');
    const width = svg.attr('width');
    const height = svg.attr('height');

    const simulation = d3.forceSimulation(this.nodes)
        .force('link', d3.forceLink(this.links).id(d => d.id).distance(150))
        .force('charge', d3.forceManyBody())
        .force('center', d3.forceCenter(width / 2, height / 2));

    const link = svg.selectAll('line')
        .data(this.links)
        .enter()
        .append('line')
        .attr('stroke', '#ccc')
        .attr('stroke-width', 1);

    const node = svg.selectAll('circle')
        .data(this.nodes)
        .enter()
        .append('circle')
        .attr('r', 10)
        .attr('fill', 'red')
        .call(d3.drag()
            .on('start', dragstarted)
            .on('drag', dragged)
            .on('end', dragended));

    const label = svg.selectAll('.label')
        .data(this.nodes)
        .enter()
        .append('text')
        .attr('class', "label")
        .text(function (d) {return d.name;})
        .attr("dx", 12)
        .attr("dy", ".35em");

    node.append('title')
        .text(d => d.name);

    simulation.on('tick', () => {
      link
          .attr('x1', d => d.source.x)
          .attr('y1', d => d.source.y)
          .attr('x2', d => d.target.x)
          .attr('y2', d => d.target.y);

      node
          .attr('cx', d => d.x)
          .attr('cy', d => d.y);
      label
          .attr('x', function (d) {return d.x;})
          .attr('y', function (d) {return d.y;});
    });

    function dragstarted(event, d) {
      if (!event.active) simulation.alphaTarget(0.1).restart();
      d.fx = d.x;
      d.fy = d.y;
    }

    function dragged(event, d) {
      d.fx = event.x;
      d.fy = event.y;
    }

    function dragended(event, d) {
      if (!event.active) simulation.alphaTarget(0);
      d.fx = null;
      d.fy = null;
    }
  }
}
</script>

到了这里,关于vue3.0 + D3.js 实现拓扑绘图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://blog.csdn.net/qfzhangwei/article/details/129911666

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包