mcpField
S
solid

solid

github.com/vercel-labs开发18.8k1.1k 次安装1 天前更新
代码仓库

关于 solid

@json-render/solid 将 json-render 规范渲染为具备细粒度响应性的 Solid 组件树,面向构建结构化界面的开发者。它提供状态、可见性、验证和操作机制,也支持流式 UI。

主要功能

  1. 01响应式 Solid 组件渲染
  2. 02状态、可见性与验证 Provider
  3. 03内置状态和表单操作
  4. 04动态属性与状态绑定
  5. 05流式 UI 和聊天生成

适用场景

  1. 01在 Solid 应用中渲染 UI 规范
  2. 02将输入控件绑定到响应式状态
  3. 03验证字段和表单
  4. 04展示流式生成的 UI

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/vercel-labs/json-render --skill solid

安装后在 Claude Code 中输入/solid确认已加载。

详细介绍

@json-render/solid

@json-render/solid 可将 json-render 规范渲染为具有细粒度响应性的 Solid 组件树。

快速开始

import { Renderer, JSONUIProvider } from "@json-render/solid";
import type { Spec } from "@json-render/solid";
import { registry } from "./registry";

export function App(props: { spec: Spec | null }) {
  return (
    <JSONUIProvider registry={registry} initialState={{}}>
      <Renderer spec={props.spec} registry={registry} />
    </JSONUIProvider>
  );
}

创建目录

import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/solid/schema";
import { z } from "zod";

export const catalog = defineCatalog(schema, {
  components: {
    Button: {
      props: z.object({
        label: z.string(),
        variant: z.enum(["primary", "secondary"]).nullable(),
      }),
      description: "Clickable button",
    },
    Card: {
      props: z.object({ title: z.string() }),
      description: "Card container",
    },
  },
  actions: {
    submit: { description: "Submit data" },
  },
});

定义组件

组件从渲染器接收 ComponentRenderProps:

interface ComponentRenderProps<P = Record<string, unknown>> {
  element: UIElement<string, P>;
  children?: JSX.Element;
  emit: (event: string) => void;
  on: (event: string) => EventHandle;
  bindings?: Record<string, string>;
  loading?: boolean;
}

示例:

import type { BaseComponentProps } from "@json-render/solid";

export function Button(props: BaseComponentProps<{ label: string }>) {
  return (
    <button onClick={() => props.emit("press")}>{props.props.label}</button>
  );
}

创建注册表

import { defineRegistry } from "@json-render/solid";
import { catalog } from "./catalog";
import { Card } from "./Card";
import { Button } from "./Button";

const { registry, handlers, executeAction } = defineRegistry(catalog, {
  components: {
    Card,
    Button,
  },
  actions: {
    submit: async (params, setState, state) => {
      // custom action logic
    },
  },
});

规范结构

{
  "root": "card1",
  "elements": {
    "card1": {
      "type": "Card",
      "props": { "title": "Hello" },
      "children": ["btn1"]
    },
    "btn1": {
      "type": "Button",
      "props": { "label": "Click me" },
      "on": {
        "press": { "action": "submit" }
      }
    }
  }
}

Provider

  • StateProvider:通过 store 进行状态模型读写和受控模式管理
  • VisibilityProvider:评估 visible 条件
  • ValidationProvider:字段验证与 validateForm 集成
  • ActionProvider:运行内置和自定义操作
  • JSONUIProvider:组合式 Provider 包装器

Hooks

  • useStateStore、useStateValue、useStateBinding
  • useVisibility、useIsVisible
  • useActions、useAction
  • useValidation、useOptionalValidation、useFieldValidation
  • useBoundProp
  • useUIStream、useChatUI

内置操作

由 ActionProvider 自动处理:

  • setState
  • pushState
  • removeState
  • validateForm

动态属性与绑定

在外层重复项内部,嵌套列表可以将 repeat.statePath 设为 { "$item": "field" }。

支持的表达式形式包括:

  • {"$state": "/path"}
  • {"$bindState": "/path"}
  • {"$bindItem": "field"}
  • {"$template": "Hi ${/user/name}"}
  • {"$computed": "fn", "args": {...}}
  • {"$cond": <condition>, "$then": <value>, "$else": <value>}

在组件中使用 useBoundProp 处理可写绑定值:

import { useBoundProp, type BaseComponentProps } from "@json-render/solid";

function Input(props: BaseComponentProps<{ value?: string }>) {
  const [, setValue] = useBoundProp(props.props.value, props.bindings?.value);
  return (
    <input
      value={String(props.props.value ?? "")}
      onInput={(e) => setValue(e.currentTarget.value)}
    />
  );
}

useBoundProp 返回一个标量值和一个回写 setter。在 JSX 中读取解析后的属性,以便后续状态更新保持响应性。

在 Solid 中,useStateValue、useStateBinding 以及 useFieldValidation 返回的 state / errors / isValid 字段都是响应式访问器。在 JSX、createMemo 或 createEffect 中调用它们。

Solid 响应性规则

  • 如果需要让值保持响应性,请勿在函数签名中解构组件属性。
  • 在 JSX 表达式、createMemo 或 createEffect 中读取会变化的值。
  • 上下文值通过基于 getter 的对象公开,因此使用者始终能观察到实时信号。

流式 UI

import { useUIStream, Renderer } from "@json-render/solid";

const stream = useUIStream({ api: "/api/generate-ui" });
await stream.send("Create a support dashboard");

<Renderer
  spec={stream.spec}
  registry={registry}
  loading={stream.isStreaming}
/>;

对于聊天 + UI 生成工作流,请使用 useChatUI。

评论

支持 Markdown