# json-render 集成使用指南 ## 概述 json-render (Vercel Labs Generative UI) 已成功集成到 frontend-v2 中,用于动态渲染 AI 生成的 UI 组件。 ## 文件结构 ``` frontend-v2/ ├── lib/ │ ├── json-render-catalog.tsx # 组件 Schema 定义和工具函数 │ └── json-render-registry.tsx # React 组件注册表 └── components/ └── JsonRenderer.tsx # 主渲染器组件 ``` ## 使用方法 ### 1. 基本用法 在聊天界面中,当 MCP 工具返回结果时,系统会自动将其转换为对应的 UI 组件并渲染。 ```tsx import JsonRenderer from '@/components/JsonRenderer'; // 渲染工具调用结果 ``` ### 2. 可用组件 #### 基础组件 | 组件类型 | 描述 | |---------|------| | `card` | 卡片容器 | | `stack` | 布局容器(行/列) | | `heading` | 标题(h1-h6) | | `text` | 文本段落 | | `button` | 按钮 | | `input` | 输入框 | | `badge` | 徽章标签 | | `separator` | 分隔线 | #### MCP 专用组件 | 组件类型 | 工具示例 | 描述 | |---------|---------|------| | `translation-result` | `translate_text` | 翻译结果展示 | | `novel-list` | `get_novels` | 小说列表 | | `chapter-reader` | `get_chapter` | 章节阅读器 | | `mcp-tool-call` | 任意工具 | 工具调用状态 | | `login-panel` | `login` | 登录面板 | | `code-block` | - | 代码块展示 | | `data-table` | - | 数据表格 | ### 3. 组件 Spec 格式 ```typescript // 翻译结果 { type: 'translation-result', original: '林风是青云宗的一名外门弟子', translated: 'Lin Feng is an outer disciple of Qingyun Sect', sourceLang: 'zh', targetLang: 'en' } // 小说列表 { type: 'novel-list', novels: [ { id: '1', title: '修仙之路', author: '张三', chapterCount: 100 }, { id: '2', title: '都市传说', author: '李四', chapterCount: 50 } ] } // 代码块 { type: 'code-block', code: 'const greeting = "Hello World";', language: 'javascript' } ``` ### 4. 工具函数 ```typescript import { specFromToolCall, specsFromToolCalls } from '@/lib/json-render-catalog'; // 从单个工具调用结果生成 spec const spec = specFromToolCall('translate_text', { original: '你好', translated: 'Hello' }); // 从多个工具调用结果生成 specs const specs = specsFromToolCalls([ { tool: 'get_novels', result: { novels: [...] } }, { tool: 'translate_text', result: { original: '你好', translated: 'Hello' } } ]); ``` ### 5. 在页面中集成 ```tsx 'use client'; import { useState } from 'react'; import JsonRenderer from '@/components/JsonRenderer'; import type { ComponentSpec } from '@/lib/json-render-catalog'; export default function MyPage() { const [specs, setSpecs] = useState([]); // 添加新的 spec const addSpec = (spec: ComponentSpec) => { setSpecs(prev => [...prev, spec]); }; return (
); } ``` ## 后续扩展 ### 添加新组件 1. 在 `json-render-catalog.tsx` 中定义 Schema 2. 在 `json-render-registry.tsx` 中实现 React 组件 3. 在注册表中注册组件 ```typescript // 1. 定义 Schema export const MyComponentSchema = z.object({ type: z.literal('my-component'), prop1: z.string(), prop2: z.number().optional(), }); // 2. 添加到 ComponentSchema 联合类型 export const ComponentSchema = z.discriminatedUnion('type', [ // ...existing schemas MyComponentSchema, ]); // 3. 在 registry.tsx 中实现组件 const MyComponent = ({ prop1, prop2, className }: any) => (
{prop1}: {prop2}
); // 4. 注册组件 export const jsonRenderRegistry = { // ...existing components 'my-component': MyComponent, }; ``` ## 技术细节 - **类型安全**: 使用 Zod 进行运行时验证 - **Dark Mode**: 所有组件支持深色模式 - **Tailwind CSS**: 样式使用 Tailwind 工具类 - **React 18**: 兼容项目的 React 版本