vue3 + antv x6 实现修改节点的大小和颜色

节点的属性:

内置节点:

修改节点属性的核心方法:

js 复制代码
source.prop('size', { width: 120, height: 50 }) // 修改 x 坐标
source.attr('rect/fill', '#ccc') // 修改填充色,等价于 source.prop('attrs/rect/fill', '#ccc')

在React中的用法:

js 复制代码
change = (command: string) => {
 const nodes = this.graph.getNodes()
 switch (command) {
   case 'prop':
     nodes.forEach((node) => {
       const width = 100 + Math.floor(Math.random() * 50)
       const height = 40 + Math.floor(Math.random() * 10)
       node.prop('size', { width, height })
     })
     break
   case 'attr':
     nodes.forEach((node) => {
       const color = Color.random().toHex()
       node.attr('body/fill', color)
     })
     break
   default:
     break
 }
}

vue3实现修改节点大小

html 复制代码
<script setup>
import {Graph} from '@antv/x6'
import {onMounted, ref} from "vue";
import {Snapline} from "@antv/x6-plugin-snapline";

const data = {
  nodes: [
    {
      id: 'node1',
      shape: 'rect',
      x: 40,
      y: 40,
      width: 100,
      height: 40,
      label: 'hello',
      attrs: {
        // body 是选择器名称,选中的是 rect 元素
        body: {
          stroke: '#8f8f8f',
          strokeWidth: 1,
          fill: '#fff',
          rx: 6,
          ry: 6,
        },
      },
    },
    {
      id: 'node2',
      shape: 'rect',
      x: 160,
      y: 180,
      width: 100,
      height: 40,
      label: 'world',
      attrs: {
        body: {
          stroke: '#8f8f8f',
          strokeWidth: 1,
          fill: '#fff',
          rx: 6,
          ry: 6,
        },
      },
    },
  ],
  // 边:连接节点
  edges: [
    {
      shape: 'edge',
      source: 'node1', // 开始节点
      target: 'node2', // 目标节点,会建立从开始节点到目标节点的连线
      label: 'x6',
      attrs: {
        // line 是选择器名称,选中的边的 path 元素
        line: {
          stroke: '#8f8f8f',
          strokeWidth: 1,
        },
      },
    },
  ],
}

const graph = ref() // 图对象
// 修改大小
const updateSize = () => {
  const nodes = graph.value.getNodes()
  nodes.forEach((node) => {
    const width = 100 + Math.floor(Math.random() * 50)
    const height = 40 + Math.floor(Math.random() * 10)
    node.prop('size', {width, height})
  })
}

onMounted(() => {
  graph.value = new Graph({
    container: document.getElementById('container'),
    width: 800,
    height: 600,
    background: {
      color: '#F2F7FA',
    },
  })
  graph.value.fromJSON(data) // 渲染元素
  graph.value.centerContent() // 居中显示

  // 使用插件
  graph.value.use(
      // 自动对齐
      new Snapline({
        enabled: true,
      }),
  )

  // 数据导出
  console.log(graph.value.toJSON())
})
</script>

<template>
  <div>
    <div>
      <button @click="updateSize">修改节点大小</button>
    </div>
    <div id="container"></div>
  </div>
</template>

<style scoped>

</style>

vue3实现修改节点颜色

html 复制代码
<script setup>
import {Color, Graph} from '@antv/x6'
import {onMounted, ref} from "vue";
import {Snapline} from "@antv/x6-plugin-snapline";

const data = {
  nodes: [
    {
      id: 'node1',
      shape: 'rect',
      x: 40,
      y: 40,
      width: 100,
      height: 40,
      label: 'hello',
      attrs: {
        // body 是选择器名称,选中的是 rect 元素
        body: {
          stroke: '#8f8f8f',
          strokeWidth: 1,
          fill: '#fff',
          rx: 6,
          ry: 6,
        },
      },
    },
    {
      id: 'node2',
      shape: 'rect',
      x: 160,
      y: 180,
      width: 100,
      height: 40,
      label: 'world',
      attrs: {
        body: {
          stroke: '#8f8f8f',
          strokeWidth: 1,
          fill: '#fff',
          rx: 6,
          ry: 6,
        },
      },
    },
  ],
  // 边:连接节点
  edges: [
    {
      shape: 'edge',
      source: 'node1', // 开始节点
      target: 'node2', // 目标节点,会建立从开始节点到目标节点的连线
      label: 'x6',
      attrs: {
        // line 是选择器名称,选中的边的 path 元素
        line: {
          stroke: '#8f8f8f',
          strokeWidth: 1,
        },
      },
    },
  ],
}

const graph = ref() // 图对象
// 修改大小
const updateSize = () => {
  const nodes = graph.value.getNodes()
  nodes.forEach((node) => {
    const width = 100 + Math.floor(Math.random() * 50)
    const height = 40 + Math.floor(Math.random() * 10)
    node.prop('size', {width, height})
  })
}
// 修改颜色
const updateColor = () => {
  const nodes = graph.value.getNodes()
  nodes.forEach((node) => {
    const color = Color.random().toHex()
    node.attr('body/fill', color)
  })
}
onMounted(() => {
  graph.value = new Graph({
    container: document.getElementById('container'),
    width: 800,
    height: 600,
    background: {
      color: '#F2F7FA',
    },
  })
  graph.value.fromJSON(data) // 渲染元素
  graph.value.centerContent() // 居中显示

  // 使用插件
  graph.value.use(
      // 自动对齐
      new Snapline({
        enabled: true,
      }),
  )

  // 数据导出
  console.log(graph.value.toJSON())
})
</script>

<template>
  <div>
    <div>
      <button @click="updateSize">修改节点大小</button>
      <button @click="updateColor">修改节点颜色</button>
    </div>
    <div id="container"></div>
  </div>
</template>

<style scoped>

</style>
相关推荐
Bs_MoneyMagnet11 分钟前
基于springboot+vue的会议室预约管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
天若有情67312 分钟前
开源轻量双语工具|一键批量查询 NPM 包历史下载量,支持按作者批量统计
javascript·npm·github pages·开源工具·netlify·前端开源·npm克隆量
咸鱼老弟25 分钟前
Speculative Decoding(投机采样):大模型"先猜后验",生成速度翻倍
前端·算法·ai编程
Bs_MoneyMagnet27 分钟前
基于springboot+vue的茶铺管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
a11177642 分钟前
网页版「MATLAB」开源
前端·开源
JianZhen✓1 小时前
解决SPA发版旧版本残留+动态路由打包失效的完整方案(附落地代码)
前端·状态模式
计算机魔术师1 小时前
Dario Amodei 发文呼吁放缓前沿 AI 开发后各方表态汇总
前端
anyup1 小时前
仍然是简单一句话,uView Pro Starter 一键清理 Skill 发布
前端·人工智能·uni-app
福兮说2 小时前
纯前端把图片压缩到指定体积:canvas.toBlob 配合二分查找
前端·javascript·canvas·图片处理
是立不是利2 小时前
CSS 入门与进阶:从选择器到响应式布局的完整指南
前端·css