/** * Append 拼接节点组件 * 用于拼接多个字符串片段 * * 特点: * - 没有执行端口(纯数据节点) * - 左边:动态数量的输入端口(文本片段 + 变量引用) * - 右边:一个输出端口(拼接结果) * - 蓝色主题 */ import { useState, useEffect } from 'react'; import { parseEchoValue } from '../echo/echo-node.js'; import { NodeRenderer } from '../node-renderer.jsx'; import './append-node.css'; export function AppendNode(props) { const { node, connections, onPortMouseDown, onPortMouseUp } = props; const [segments, setSegments] = useState([]); console.log(`🎨 [AppendNode] 渲染 Append 节点:`, { id: node.id, x: node.x, y: node.y, value: node.data?.value }); // 解析 value 获取片段 useEffect(() => { const value = node.data?.value || ''; const parsed = parseEchoValue(value); console.log(` 📊 [AppendNode useEffect] 更新 segments:`, parsed); setSegments(parsed); }, [node.data?.value]); // 检查端口是否已连接 const isPortConnected = (portId) => { if (!connections || !Array.isArray(connections)) return false; return connections.some(conn => (conn.target === node.id && conn.targetPort === portId) || (conn.source === node.id && conn.sourcePort === portId) ); }; // 数据端口 const inputPorts = node.inputs || []; const outputPort = node.outputs?.[0]; console.log(` 🔌 [AppendNode] 端口信息 - inputPorts:`, inputPorts.length, `outputPort:`, !!outputPort); // 自定义内容渲染 const renderCustomBody = () => { console.log(` 🎨 [AppendNode renderCustomBody] 开始渲染,segments 数量: ${segments.length}, inputPorts 数量: ${inputPorts.length}`); return (