当前位置: 首页 > news >正文

antvX6自定义 HTML 节点创建与更新教程

自定义 HTML 节点创建与更新教程

本文详细介绍如何利用 HTML、CSS 和 JavaScript 创建自定义节点,并通过动态更新节点数据来改变节点显示效果。无论你是否有前端基础,都能轻松跟着本教程一步步实现。


1. 基础样式设置

首先,使用 CSS 定义基础样式,确保整个页面及节点内的文字、链接、按钮等元素呈现出整洁美观的效果。

:root {
  line-height: 1.5;
  font-weight: 400;
  font-synthesis: none;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  -webkit-text-size-adjust: 100%;
}

a {
  font-weight: 500;
  color: #646cff;
  text-decoration: inherit;
}
a:hover {
  color: #535bf2;
}

body {
  margin: 0;
}

2. 自定义节点 HTML 结构与样式

我们将自定义节点设计为左右分栏结构:

左侧:显示图标(图片)

右侧:显示文本信息(如节点标题)

2.1 HTML 结构示例

<div class="cu_html_container">
  <img class="cu_html_top" src="icon.png" alt="节点图标" />
  <div class="cu_html_text">
    <div class="cu_html_title">节点标题</div>
  </div>
</div>

2.2 对应的 CSS 样式


.cu_html_container {
  display: flex;              /* 使用 flexbox 实现水平排列 */
  flex-direction: row;
  align-items: center;        /* 垂直居中对齐 */
  justify-content: flex-start;
  background: white;
  border: 1px solid #ddd;
  border-radius: 2px;
  padding: 8px;
  height: 50px;               /* 固定高度 */
  box-shadow: 0 5px 8px rgba(128, 145, 165, 0.1);
}

.cu_html_top {
  width: 30px;                /* 图标宽度 */
  height: 30px;               /* 图标高度 */
  margin-right: 10px;         /* 图标与文本之间的间距 */
}

.cu_html_text {
  display: flex;
  flex-direction: row;
  align-items: center;
  flex: 1;                    /* 占满剩余空间 */
  white-space: nowrap;        /* 防止文本换行 */
  overflow: hidden;
  text-overflow: ellipsis;    /* 超出部分用省略号显示 */
}

.cu_html_title {
  font-size: 14px;
  font-weight: 500;
  color: #333;
  line-height: 1.2;
  overflow: hidden;
  text-overflow: ellipsis;
}

3. 动态更新节点状态

利用 JavaScript,我们可以根据节点的状态动态更新节点的图标显示。下面的代码示例展示了如何实现这一功能。

export const updateNodeImage = (cell, releaseState) => {
  // 判断节点状态:若 releaseState 为 "-2" 或 "0" 则表示离线状态
  const isOffline = releaseState === "-2" || releaseState === "0";
  // 根据状态选择对应的图片路径
  const imagePath = isOffline ? '/assets/system/images/dpp/xx.png' : '/assets/system/images/dpp/sx.png';

  // 获取当前节点数据
  const currentData = cell.getData();
  // 构建更新后的数据
  const newData = {
    ...currentData,
    releaseState: releaseState,
    taskParams: {
      ...currentData.taskParams,
      imagePath: imagePath
    }
  };
  
  // 更新节点数据
  cell.setData(newData);
};

说明:

releaseState:用于表示节点当前状态;若值为 “-2” 或 “0” 则认为节点离线。

imagePath:根据节点状态选用对应的图片资源(离线图标或在线图标)。

cell.getData() / cell.setData():分别用于获取和更新节点的数据。

4. 注册自定义节点到 AntV X6

为了在 AntV X6 图形库中使用自定义节点,我们需要通过其 API 将自定义节点注册。下面的代码展示了如何定义节点的 HTML 结构和图标处理逻辑。

export const useHtmlNode = (node) => {
  Shape.HTML.register({
    shape: 'cu-data-node',  // 自定义节点类型名称
    width: 180,
    height: 60,
    html(cell) {
      // 解构节点数据
      const { name: nodeName, icon, releaseState, taskParams } = cell.getData();
      // 创建节点外层容器
      const htmlContainer = document.createElement('div');
      htmlContainer.setAttribute('class', 'cu_html_container');
      
      // 创建图标元素
      const htmlTop = document.createElement('img');
      htmlTop.setAttribute('class', 'cu_html_top');
      
      // 图标处理:优先使用 taskParams.icon,否则使用 icon 字段
      let iconSrc = taskParams.icon || icon;
      if (iconSrc && iconSrc.startsWith('data:image')) {
        htmlTop.setAttribute('src', iconSrc);
      } else if (iconSrc) {
        // 如果图标不是 base64 格式,则进行转换
        DataUri.imageToDataUri(iconSrc, function (nu, url) {
          htmlTop.src = url;
          // 将转换后的 base64 图标存回节点数据中
          const newData = {
            ...cell.getData(),
            taskParams: { ...taskParams, icon: url }
          };
          cell.setData(newData);
        });
      }
      
      // 创建文本区域
      const htmlText = document.createElement('div');
      htmlText.setAttribute('class', 'cu_html_text');
      
      // 创建并设置节点标题
      const htmlTitle = document.createElement('div');
      htmlTitle.setAttribute('class', 'cu_html_title');
      htmlTitle.innerText = nodeName;
      
      // 组合文本区域和图标到容器中
      htmlText.appendChild(htmlTitle);
      htmlContainer.appendChild(htmlTop);
      htmlContainer.appendChild(htmlText);
      
      return htmlContainer;
    }
  });
};

Shape.HTML.register:AntV X6 提供的接口,用于注册自定义 HTML 节点。

该函数定义了节点的宽度、高度和 HTML 生成逻辑,确保节点的图标与文本能够正确显示。

图标来源优先取自 taskParams.icon,若不存在则使用 icon 字段。

5. 总结

通过本教程,你学会了如何:

使用 CSS 设置基础样式和布局;

构建一个包含图标和文本的自定义 HTML 节点;

利用 JavaScript 动态更新节点状态(如上下线状态)来改变图标显示;

将自定义节点注册到 AntV X6 图形库中,方便在可视化图表中使用。

这种方法不仅使节点外观得以灵活定制,还能实时响应状态变化,提升交互性和用户体验。希望本教程能帮助你快速上手,实现个性化的图表展示!

http://www.dtcms.com/a/107061.html

相关文章:

  • 使用Leaflet对的SpringBoot天地图路径规划可视化实践-以黄花机场到橘子洲景区为例
  • 爬虫【Scrapy-redis分布式爬虫】
  • SQL 转 PHP Eloquent、Doctrine ORM, 支持多数据库
  • [python] 正则表达式
  • Enovia许可类型及其区别
  • 蓝桥杯 web 知识点集合
  • ngx_sprintf
  • Nginx 核心配置详解与性能优化最佳实践
  • 栈 —— 数据结构基础刷题路程
  • Linux: 进程信号初识
  • 批量提取 PDF 文档中指定页为新的 PDF 文档
  • 【结肠AI分割论文合集1(2021~2023年份)】A survey1
  • 深入探索Redisson:用法全解析及在微服务中的关键应用
  • UCOS和RTOS的区别
  • 算法:双指针法--计算两数之和
  • 数据驱动的智能BMS革新:机器学习赋能电池健康预测与安全协同优化
  • 重新安装VMware tools为灰色无法点击问题解决|读取电脑文件的共享文件夹方法
  • 蓝桥杯刷题
  • 4月2号.
  • 代码随想录C++算法训练,二叉树(day18)
  • 辛格迪客户案例 | 盛大康成GMP质量合规数字化(QMS)项目
  • ros2--urdf--IMU
  • uperMap GIS基础产品FAQ集锦(20250402)
  • 「2025最新版React+Ant Design+Router+TailwindCss全栈攻略:从零到实战,打造高颜值企业级应用
  • [ 3分钟算法 ] | 递归搜索题目 : 合并两个有序链表(递归版)
  • C++虚继承及其它特性
  • 智谱发布AI Agent“AutoGLM沉思”,开启AI“边想边干”新时代
  • k8s之Ingress讲解
  • 定制化自己的 RAG 框架:结合 LlamaIndex 与自定义优化
  • c加加学习之day01