关于 solid
@json-render/solid 将 json-render 规范渲染为具备细粒度响应性的 Solid 组件树,面向构建结构化界面的开发者。它提供状态、可见性、验证和操作机制,也支持流式 UI。
主要功能
- 01响应式 Solid 组件渲染
- 02状态、可见性与验证 Provider
- 03内置状态和表单操作
- 04动态属性与状态绑定
- 05流式 UI 和聊天生成
适用场景
- 01在 Solid 应用中渲染 UI 规范
- 02将输入控件绑定到响应式状态
- 03验证字段和表单
- 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、useStateBindinguseVisibility、useIsVisibleuseActions、useActionuseValidation、useOptionalValidation、useFieldValidationuseBoundPropuseUIStream、useChatUI
内置操作
由 ActionProvider 自动处理:
setStatepushStateremoveStatevalidateForm
动态属性与绑定
在外层重复项内部,嵌套列表可以将 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