You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为ReteJS单个节点/连接添加自定义类或样式?

在ReteJS + React渲染器中为单个节点/连接自定义样式

一、单个节点的自定义样式

别用全局CSS统一控制所有节点,通过给节点绑定自定义数据+自定义React节点组件是最规范的个性化样式实现方式:

  1. 创建节点时注入自定义样式信息
// 示例:创建带自定义类名和背景色的节点
const myNode = new Node("custom-type");
myNode.data = {
  customClass: "highlight-node",
  bgColor: "#165DFF"
};
editor.addNode(myNode);
  1. 编写自定义React节点组件
    将节点数据里的样式信息动态应用到DOM元素:
const CustomNode = ({ node }) => {
  return (
    <div
      data-testid="node"
      className={`rete-base-node ${node.data.customClass || ""}`}
      style={{
        backgroundColor: node.data.bgColor || "#0D1117",
        borderColor: node.data.borderColor || "#495057"
      }}
    >
      <div className="node-title">{node.name}</div>
      {/* 渲染节点的输入/输出插槽 */}
      {node.inputs.map(input => (
        <div key={input.key} data-testid="input-socket">
          {/* 插槽内容 */}
        </div>
      ))}
      {node.outputs.map(output => (
        <div key={output.key} data-testid="output-socket">
          {/* 插槽内容 */}
        </div>
      ))}
    </div>
  );
};

// 把自定义组件注册到React渲染器
renderer.addNode("custom-type", CustomNode);
  1. 补充针对性CSS(可选)
    如果用了自定义类名,可以写专属样式:
.rete-base-node.highlight-node {
  box-shadow: 0 0 8px rgba(22, 93, 255, 0.5);
}

二、单个连接的自定义样式

你之前扩展Connection类的思路是对的,只是需要配合自定义连接组件让渲染器正确识别样式:

  1. 正确扩展Connection类
    把样式信息存在实例的data中,或直接通过getStyle()返回:
// 定义自定义连接样式
const activeConnStyle = {
  stroke: "#28A745",
  strokeWidth: 4
};

class ActiveConnection extends Classic.Connection {
  constructor(source, sourceSlot, target, targetSlot) {
    super(source, sourceSlot, target, targetSlot);
    this.data = {
      label: "激活连接",
      style: activeConnStyle
    };
  }

  // 重写getStyle方法返回自定义样式
  getStyle() {
    return this.data.style || super.getStyle();
  }
}
  1. 自定义React连接组件
    读取连接样式并应用到SVG路径:
const CustomConnection = ({ connection }) => {
  const connStyle = connection.getStyle();
  return (
    <svg data-testid="connection">
      <path
        d={connection.path} // Rete自动生成的连接路径
        stroke={connStyle.stroke}
        strokeWidth={connStyle.strokeWidth}
        fill="none"
        strokeLinecap="round"
      />
      {/* 渲染连接标签(可选) */}
      {connection.data.label && (
        <text
          x={connection.path.getBBox().cx}
          y={connection.path.getBBox().cy}
          fill="#fff"
          textAnchor="middle"
        >
          {connection.data.label}
        </text>
      )}
    </svg>
  );
};

// 注册自定义连接组件
renderer.addConnection("active-connection", CustomConnection);
  1. 创建连接时使用自定义类
// 示例:创建自定义连接
const conn = new ActiveConnection(sourceNode, "output-slot", targetNode, "input-slot");
editor.addConnection(conn);

不推荐「维护节点列表+选择器匹配」方案的原因

这种取巧方式存在两个核心问题:

  • 性能差:每次连接变化都要遍历列表、操作DOM选择器,节点数量多的时候会明显卡顿
  • 不可靠:Rete内部会动态更新DOM结构,选择器容易失效,尤其是节点拖拽、编辑器缩放时

内容的提问来源于stack exchange,提问作者joeybab3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:26:16