vue3+vite+antv/x6 渲染自定义的节点与节点间连线失败

前提背景:

数据源节点和目标节点都拿到了,创建的边也有实例,也确认了节点位置是在视图范围内的,节点也是可以正常渲染出来。但是页面上就是没有渲染出来边,控制台也没有报错。看html结构,边的宽和高这些都是0,可是加了宽和高也没有展示。

思考过程:

搞了一个简化版的,连箭头都没有展示出来,我就知道大事不妙了。
在这里插入图片描述

尝试了各种办法,终于搞出来了箭头。
在这里插入图片描述
这个时候我尝试改了渲染的方式,看起来好像是因为用了render,而不是用template。
我就在想说不然干脆把画布这块单独抽离出来变成一个组件,再使用render的方式渲染,看看能不能有连线,然鹅不出意料地依然失败了。

解决方案:

因为我发现单独抽出来用render也不行,我又开始看组件库文档,真的那几天快熟读背诵了。
最终发现应该是创建边的方式不同。我改了边数据的遍历方式,终于可以了!!!
效果图我就不放了,其实就是两排自定义的节点以及节点和节点之间如果有关联,就要连上线,并且线上有具体数值的内容。
附上解决方案的代码:

//在画布初始化的时候还要加上这些配置项:
 connecting: {
        snap: true,
        allowBlank: false,
        allowLoop: false,
        highlight: true,
        // connector: 'i-connector',
        // connectionPoint: 'anchor',
        // anchor: 'center',
        validateMagnet: ({ magnet }) => {
          return magnet.getAttribute('port-group') !== 'top';
        },

        createEdge() {
          return graphInstance.value.createEdge({
            shape: 'dag-edge',
            attrs: {
              line: {
                strokeDasharray: '5 5',
              },
            },
            labels: [
              {
                attrs: {
                  label: {
                    text: 'My Custom Label',
                    fill: '#333',
                    fontSize: 12,
                  },
                },
                position: {
                  distance: 0.5, // 标签位置,0 表示最靠近源节点,1 表示最靠近目标节点
                },
              },
            ],
            zIndex: -1,
          });
        },
      },
      panning: {
        enabled: true,
        modifiers: 'shift', // 按住 shift 键进行平移
      },

并且使用addEdge的方法把具体的边的实例添加到画布当中。
在这里插入图片描述
以上~

Vue 3Vue.js的最新版本,它具有更好的性能、更好的TypeScript支持、更好的开发者体验等特点。Vite是一个轻量级的Web应用程序构建工具,它可以快速地构建Vue项目,同时支持TypeScriptAntV X6是一个强大的图形可视化库,它可以帮助开发人员快速地创建各种类型的图表和流程图。 下面是一个使用Vue 3ViteTypeScriptAntV X6自定义节点元素案例代码: ``` <template> <div class="app"> <x6-graph :graph="graph" :width="800" :height="600"> <template #default="{ node }"> <x6-rect v-if="node.data.type === &#39;rect&#39;" :node="node" :width="node.getSize().width" :height="node.getSize().height" :fill="node.getStyle().fillColor" :stroke="node.getStyle().strokeColor" /> <x6-circle v-else-if="node.data.type === &#39;circle&#39;" :node="node" :r="node.getSize().width / 2" :fill="node.getStyle().fillColor" :stroke="node.getStyle().strokeColor" /> </template> </x6-graph> </div> </template> <script lang="ts"> import { defineComponent, ref } from &#39;vue&#39; import { Graph, Node, Rect, Circle } from &#39;@antv/x6&#39; import { useUndoRedo } from &#39;@antv/x6-vue&#39; export default defineComponent({ setup() { const graph = ref<Graph>() useUndoRedo({ graph }) const nodes = [ { type: &#39;rect&#39;, x: 100, y: 100, width: 100, height: 50, style: { fillColor: &#39;#ffffff&#39;, strokeColor: &#39;#000000&#39;, }, }, { type: &#39;circle&#39;, x: 300, y: 100, width: 100, height: 100, style: { fillColor: &#39;#ffffff&#39;, strokeColor: &#39;#000000&#39;, }, }, ] graph.value = new Graph({ container: document.querySelector(&#39;.app&#39;)!, }) nodes.forEach((node) => { const shape = node.type === &#39;rect&#39; ? Rect : Circle const newNode = new Node({ x: node.x, y: node.y, width: node.width, height: node.height, shape, data: node, }) newNode.setStyle(node.style) graph.value.addNode(newNode) }) return { graph } }, }) </script> ``` 此代码演示了如何在Vue 3项目中使用AntV X6创建自定义节点元素。在这个示例中,我们创建了两个同类型的节点:一个矩形和一个圆形。我们通过给每个节点添加一个"type"属性来区分它们的类型。然后,我们在Vue模板中使用了`x6-rect`和`x6-circle`组件来渲染节点元素,这些组件分别对应于`Rect`和`Circle`节点形状。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值