用途
@json-render/react 是 json-render 的 React 渲染器,用于把 JSON 规格(spec)转换为 React 组件树。适用于使用 @json-render/react、从 JSON 构建 React UI 等场景。
主要能力
- 目录(Catalog)定义:使用 @json-render/core 的 defineCatalog 配合 @json-render/react/schema 的 schema 与 zod,声明组件的 props 结构、插槽(slots)和描述。
- 注册表(Registry):通过 defineRegistry 从目录创建类型安全的组件注册表,组件实现可接收 props、children、slots、emit、on、element、bindings 等。
- 元素树 spec:React schema 使用元素树格式,包含 root、type、props、children 等字段。
- 命名插槽:children 对应 "default" 插槽;其他插槽通过元素顶层 slots 对象声明,注册表组件以 slots?.header、slots?.footer 等接收,不使用 slots.default。
- 可见性条件:元素上的 visible 字段可基于状态显示/隐藏,支持 { "$state": "/path" }、eq、not、$and、$or,以及 visibility.when/unless/eq/and/or 辅助函数。
- Provider:StateProvider(跨组件共享状态,JSON Pointer 路径,可传 store 进入受控模式)、ActionProvider(处理事件系统派发的动作)、VisibilityProvider(基于状态的条件渲染)、ValidationProvider(表单字段校验)。
- 外部状态存储(受控模式):向 StateProvider(或 JSONUIProvider / createRenderer)传入 StateStore,可接入 Redux、Zustand、XState 等外部状态管理;提供 store 时 initialState 与 onStateChange 会被忽略。
- 动态 prop 表达式:任何 prop 值都可由渲染器在组件接收前解析,包括 $state(单向读取)、$bindState(双向绑定,用于表单组件的自然值 prop,如 value、checked、pressed)、$bindItem(在 repeat 作用域内对重复项字段双向绑定)、$cond(条件值)、$template(字符串插值)、$computed(调用已注册函数)。
- 列表:repeat 配合 $item 可见性条件可渲染过滤后的列表;repeat 内可嵌套 repeat 迭代外层项上的数组。
- 事件系统:组件通过 emit 触发命名事件,或通过 on() 获取带元数据的事件句柄;元素的 on 字段把事件映射到动作绑定。on() 返回的 EventHandle 含 emit()、shouldPreventDefault(布尔)、bound(布尔)。
- 状态监听:元素可声明顶层 watch 字段,在状态值变化时触发动作。
- 内置动作:setState、pushState、removeState、validateForm 内置于 React schema,由 ActionProvider 自动处理,并注入 AI 提示,无需在 catalog actions 中声明。validateForm 校验所有已注册字段并把 { valid, errors } 写入状态。
- useBoundProp:用于需要双向绑定的表单组件,配合渲染器提供的 bindings map 使用,返回 [value, setValue]。
- BaseComponentProps:用于构建不绑定特定目录的可复用组件库(如 @json-render/shadcn)。
使用方式
快速开始:从 @json-render/react 导入 defineRegistry 与 Renderer,从本地 catalog 导入目录,用 defineRegistry(catalog, { components: { ... } }) 得到 registry,再在组件中渲染 spec。
创建目录:从 @json-render/core 导入 defineCatalog,从 @json-render/react/schema 导入 schema,从 @json-render/react 导入 defineRegistry,从 zod 导入 z;用 defineCatalog(schema, { components: { ... } }) 声明组件及其 props schema、slots、description。
定义实现:用 defineRegistry(catalog, { components: { ... } }) 提供类型安全的组件实现。
注册 $computed 函数:通过 JSONUIProvider 或 createRenderer 的 functions prop 注册。
双向绑定:组件不使用 statePath prop 做双向绑定,而是在自然值 prop 上使用 { "$bindState": "/path" };组件接收已解析的 props,双向绑定 prop 需配合 useBoundProp 与渲染器提供的 bindings map。
适用场景
- 从 JSON 规格动态生成 React UI。
- 构建由 AI 生成或数据驱动的界面。
- 需要类型安全组件目录、插槽、条件渲染、表单校验与状态管理的 React 应用。
- 需要接入外部状态管理(Redux、Zustand、XState 等)的场景。
- 构建不绑定特定目录的可复用组件库。
限制
资料未提供关于收费、价格、平台支持范围、性能表现或效果的具体说明,暂未提供。