底部面板标签页 API 允许扩展为 ComfyUI 界面的底部面板添加自定义标签页。这对于添加日志、调试工具或自定义面板等功能非常有用。

基本用法

app.registerExtension({
  name: "MyExtension",
  bottomPanelTabs: [
    {
      id: "customTab",
      title: "Custom Tab",
      type: "custom",
      render: (el) => {
        el.innerHTML = '<div>这是我的自定义标签页内容</div>';
      }
    }
  ]
});

标签页配置

每个标签页都需要 idtitletype,以及一个渲染函数:

{
  id: string,              // 标签页的唯一标识符
  title: string,           // 标签页上显示的标题
  type: string,            // 标签页类型(通常为 "custom")
  icon?: string,           // 图标类名(可选)
  render: (element) => void // 用于填充标签页内容的函数
}

render 函数会接收一个 DOM 元素,你应在其中插入标签页的内容。

交互元素

你可以添加如按钮等交互元素:

app.registerExtension({
  name: "InteractiveTabExample",
  bottomPanelTabs: [
    {
      id: "controlsTab",
      title: "Controls",
      type: "custom",
      render: (el) => {
        el.innerHTML = `
          <div style="padding: 10px;">
            <button id="runBtn">运行工作流</button>
          </div>
        `;
        
        // 添加事件监听器
        el.querySelector('#runBtn').addEventListener('click', () => {
          app.queuePrompt();
        });
      }
    }
  ]
});

使用 React 组件

你可以在底部面板标签页中挂载 React 组件:

// 在你的扩展中引入 React 依赖
import React from "react";
import ReactDOM from "react-dom/client";

// 简单的 React 组件
function TabContent() {
  const [count, setCount] = React.useState(0);
  
  return (
    <div style={{ padding: "10px" }}>
      <h3>React 组件</h3>
      <p>计数:{count}</p>
      <button onClick={() => setCount(count + 1)}>递增</button>
    </div>
  );
}

// 注册带有 React 内容的扩展
app.registerExtension({
  name: "ReactTabExample",
  bottomPanelTabs: [
    {
      id: "reactTab",
      title: "React Tab",
      type: "custom",
      render: (el) => {
        const container = document.createElement("div");
        container.id = "react-tab-container";
        el.appendChild(container);
        
        // 挂载 React 组件
        ReactDOM.createRoot(container).render(
          <React.StrictMode>
            <TabContent />
          </React.StrictMode>
        );
      }
    }
  ]
});

独立注册

你也可以在 registerExtension 之外注册标签页:

app.extensionManager.registerBottomPanelTab({
  id: "standAloneTab",
  title: "Stand-Alone Tab",
  type: "custom",
  render: (el) => {
    el.innerHTML = '<div>此标签页是独立注册的</div>';
  }
});