全面展示 vercel-labs/json-render 的所有功能
json-render 是 Vercel Labs 开源的 Generative UI 框架,让 AI 能够根据自然语言提示生成动态、个性化的 UI,同时保持可预测性和安全性。
| 特性 | 说明 |
|---|---|
| 🛡️ 安全边界 | AI 只能使用 Catalog 中定义的组件 |
| 📊 可预测输出 | JSON 输出始终匹配预定义的 Schema |
| ⚡ 流式渲染 | 支持增量更新 UI |
| 🌐 跨平台 | React, Vue, React Native, Remotion, PDF, Email, Image |
| 📦 内置组件 | 36 个预构建的 shadcn/ui 组件 |
# 克隆项目
git clone https://github.com/wangjs-jacky/json-render-examples.git
# 进入项目目录
cd json-render-examples
# 安装依赖
pnpm install
# 启动开发服务器
pnpm dev
# 访问示例页面
open http://localhost:3000| 编号 | 示例 | 说明 |
|---|---|---|
| 01 | 基础渲染 | Catalog, Registry, Renderer 的基本使用 |
| 02 | 状态管理 | StateStore, $state, $bindState |
| 03 | 可见性条件 | visible, $cond, AND/OR 逻辑 |
| 04 | 动态属性 | $computed, $template, $cond/$then/$else |
| 05 | 动作系统 | actions, setState, handlers |
| 06 | 重复作用域 | repeat, $item, $index |
| 07 | 流式渲染 | SpecStream, JSON Patch |
| 08 | 表单验证 | checks, validateOn, 内置验证函数 |
| 09 | shadcn 组件 | 36 个预构建 shadcn/ui 组件 |
| 10 | AI 集成 | AI SDK, prompt 生成 |
| 11 | 嵌套格式 | nestedToFlat 转换 |
| 12 | Spec 验证 | validateSpec, autoFixSpec |
| 13 | 状态监听 | watch, 级联选择 |
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Catalog │────▶│ Registry │────▶│ Renderer │
│ (词汇表) │ │ (实现层) │ │ (渲染器) │
└─────────────┘ └─────────────┘ └─────────────┘
const catalog = defineCatalog(schema, {
components: {
Card: {
props: z.object({ title: z.string() }),
description: "卡片容器",
},
},
actions: {
submit: { description: "提交表单" },
},
});const { registry } = defineRegistry(catalog, {
components: {
Card: ({ props, children }) => (
<div className="card">
<h3>{props.title}</h3>
{children}
</div>
),
},
});const spec = {
root: "card-1",
elements: {
"card-1": {
type: "Card",
props: { title: "Hello" },
children: [],
},
},
};| 表达式 | 说明 |
|---|---|
{ $state: "/path" } |
从状态模型读取值 |
{ $bindState: "/path" } |
双向绑定到状态 |
{ $item: "field" } |
从 repeat 项读取字段 |
{ $index: true } |
获取 repeat 索引 |
{ $cond, $then, $else } |
条件表达式 |
{ $computed: "fn" } |
调用计算函数 |
{ $template: "text ${/path}" } |
模板字符串 |
// 简单条件
visible: { $state: "/isLoggedIn" }
// 反转条件
visible: { $state: "/isAdmin", not: true }
// 比较操作
visible: { $state: "/count", gt: 5 }
// AND 条件
visible: [{ $state: "/a" }, { $state: "/b" }]
// OR 条件
visible: { $or: [{ $state: "/a" }, { $state: "/b" }] }// 内置 setState 动作
on: {
press: {
action: "setState",
actionParams: { statePath: "/count", value: 0 },
confirm: { title: "确认重置?" },
onSuccess: { action: "notify", actionParams: { message: "成功" } },
},
}{
type: "TodoItem",
repeat: { statePath: "/todos", key: "id" },
props: {
title: { $item: "title" },
index: { $index: true },
},
}json-render-examples/
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── page.tsx # 首页
│ │ ├── layout.tsx # 布局
│ │ ├── examples/ # 示例页面路由
│ │ └── examples.ts # 示例配置
│ ├── examples/ # 示例实现
│ │ ├── 01-basic-rendering.tsx
│ │ ├── 02-state-management.tsx
│ │ └── ...
│ └── lib/ # 工具库
│ ├── catalog.ts
│ └── registry.tsx
├── docs/
│ └── FEATURES.md # 功能详细文档
├── README.md # 英文文档
├── README_CN.md # 中文文档(本文件)
└── package.json
MIT