vue js 流程图

需求:用代码做一个流程图

在这里插入图片描述

安装d3和

yarn add d3
yarn add dagre-d3

引入

import dagreD3 from "dagre-d3";
import * as d3 from "d3";

html

<template>
    <div>
      <!-- <svg id="svg-canvas" width="800" height="100">
        <g />
        <rect />
      </svg> -->
      <div id="flowchart"></div>
    </div>
</template>

js代码

export default {
  name: 'Index',
  data() {
    return {
      list: {
        nodeInfos: [
          {
            id: '1',
            label: '新建中',
          },
          {
            id: '2',
            label: '发起人-编辑中',
          },
          {
            id: '3',
            label: 'QA-审核中',
          },
          {
            id: '4',
            label: '分管-审核中',
          },
          {
            id: '5',
            label: '结束',
          },
        ],
        edges: [
          {
            source: '1',
            target: '2',
            label: '保存',
          },
          {
            source: '1',
            target: '3',
            label: '提交',
          },
          {
            source: '3',
            target: '4',
            label: '同意',
          },
          {
            source: '3',
            target: '2',
            label: '拒绝',
          },
          {
            source: '4',
            target: '5',
            label: '同意',
          },
          {
            source: '4',
            target: '2',
            label: '拒绝',
          },
          {
            source: '2',
            target: '2',
            label: '保存',
          },
          {
            source: '2',
            target: '3',
            label: '提交',
          },
        ],
      },
    };
  },
  mounted() {
    this.getCanvas();
  },
  methods: {
    getCanvas() {
      //获取D3
      var g = new dagreD3.graphlib.Graph().setGraph({
        // rankdir: 'BT',//渲染数据的方向:LR为水平方向,BT垂直方向
        // align: 'DL',
        // nodesep: 40,
        // edgesep: 80,
        // ranksep: 60,
        // marginx: 140,
        // marginy: 140,
      });
      console.log(g);
      // 添加节点
      this.list.nodeInfos.forEach((item, index) => {
        item.rx = item.ry = 5; //圆角
        if (item.id === '1' || item.id === '5') {
          item.rx = item.ry = 100; //圆角
        }
        if (item.id === '2') {
          item.rx =100;
           item.ry = 10; 
        }
        g.setNode(item.id, item);
        // 节点颜色 fill指节点背景色,stroke指节点描边颜色
        g.node(item.id).style = 'fill:' + '#e1efe1' + ';stroke: green;';
      });
      // 链接关系
      this.list.edges.forEach((item) => {
        g.setEdge(item.source, item.target, {
          // 连线上的条件字
          label: item.label,
          // 连线的颜色
          style: 'stroke: #0fb2cc; fill: none;',
          // 箭头颜色
          arrowheadStyle: 'fill: #0fb2cc;stroke: #0fb2cc;',
          // 箭头形状(vee表示箭头是尖的,默认是平的)
          arrowhead: 'vee',
        });
      });
      g.nodes().forEach(function (v) {
        // console.log('Node ' + v + ': ' + JSON.stringify(g.node(v)));
      });
      g.edges().forEach(function (e) {
        // console.log('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(g.edge(e)));
      });
      //绘制图形(此处和darg中的不同)
      var svg = d3.select('#flowchart').append('svg').attr('width', 1000).attr('height', 1500);
      var inner = svg.append('g');
      //缩放
      var zoom = d3.zoom().on('zoom', function () {
        inner.attr('transform', d3.zoomTransform(svg.node()));
      });
      svg.call(zoom);
      var render = new dagreD3.render();
      render(inner, g);
      let code;
      inner
        .selectAll('g.node')
        .on('click', (e) => {
          //点击事件
          code = this.list.nodeInfos.filter((item) => {
            return item.id == e;
          });
          // console.log(code);
        })
        .on('mouseover', (e) => {
          //鼠标经过事件
          let curNode = g.node(e);
          // console.log(curNode, 'curNode');
        });
      // 初始化缩放比例
      var initialScale = 1;
      // 设置宽高
      svg.call(
        zoom.transform,
        d3.zoomIdentity.translate((svg.attr('width') - g.graph().width * initialScale) / 2, 20).scale(initialScale)
      );
      svg.attr('height', g.graph().height * initialScale + 40);
    },
  },
};

琢磨了很久,不知道好看的样式怎么调 ,慢慢来吧

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js是一种流行的JavaScript框架,可以用于构建用户界面。要实现流程图组件,可以使用Vue.js结合其他库或插件来实现。以下是一个使用Vue.js和GoJS库来实现流程图组件的示例: 首先,确保你已经安装了Vue.js和GoJS库。可以通过以下命令来安装它们: ```shell npm install vue npm install gojs ``` 然后,在Vue组件中引入GoJS库,并在`mounted`生命周期钩子中初始化流程图。在模板中,可以使用`div`元素作为容器来显示流程图。 ```javascript <template> <div id="flowchart"></div> </template> <script> import go from 'gojs'; export default { mounted() { const $ = go.GraphObject.make; const myDiagram = $(go.Diagram, 'flowchart'); // 在这里添加流程图的定义和布局 // 示例:添加一个节点 myDiagram.nodeTemplate = $(go.Node, 'Auto', $(go.Shape, 'RoundedRectangle', { fill: 'lightblue' }), $(go.TextBlock, { margin: 8 }, new go.Binding('text', 'key')) ); // 示例:添加一个连接线 myDiagram.linkTemplate = $(go.Link, $(go.Shape), $(go.Shape, { toArrow: 'Standard' }) ); // 示例:添加一些节点和连接线 myDiagram.model = new go.GraphLinksModel( [ { key: 'Node1' }, { key: 'Node2' }, { key: 'Node3' } ], [ { from: 'Node1', to: 'Node2' }, { from: 'Node2', to: 'Node3' } ] ); } } </script> ``` 在上述示例中,我们使用了GoJS的一些基本概念,如节点模板和连接线模板。你可以根据自己的需求自定义节点和连接线的样式。 请注意,上述示例只是一个简单的示例,你可以根据自己的需求进行更复杂的定制。同时,你还可以使用其他流程图库或自己手写一个组件来实现流程图功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值