Vue

作者 vercel-labsfc2a696a50a3无许可证18K 个星标收录于 2026年10月8日更新于 2026年10月8日仓库昨天更新

Vue 3 renderer for json-render. Use when building Vue UIs from JSON specs, working with @json-render/vue, defining Vue component registries, or rendering AI-generated specs in Vue.

精选仅含说明Software Development
AI 生成的概览

介绍 @json-render/vue 的参考指南,这是一个将 JSON 规格转换为 Vue 组件树的 Vue 3 渲染器。

功能
该技能介绍 @json-render/vue,这是一个 Vue 3 渲染器,可将 JSON 规格转换为带数据绑定、可见性条件和动作的 Vue 组件树。它说明如何用 Zod schema 定义 catalog、用 Vue h() 渲染函数构建组件注册表,并通过 StateProvider、ActionProvider、VisibilityProvider、ValidationProvider 等 provider 渲染规格。内容还涵盖组合式函数、具名插槽、动态 prop 表达式、内置动作、事件系统、流式辅助函数以及外部状态存储。
适用场景
适用于从 JSON 规格构建 Vue UI、使用 @json-render/vue、定义 Vue 组件注册表,或在 Vue 中渲染 AI 生成的规格。它是面向集成该渲染器的开发者的参考资料,而非任务工作流。
运行要求
需要 npm 包 @json-render/vue、@json-render/core 和 zod,以及对等依赖 vue ^3.5.0 与 zod ^4.0.0。不附带脚本,仅为文档。

@json-render/vue

Vue 3 renderer that converts JSON specs into Vue component trees with data binding, visibility, and actions.

Installation

bash
npm install @json-render/vue @json-render/core zod

Peer dependencies: vue ^3.5.0 and zod ^4.0.0.

Quick Start

Create a Catalog

typescript
import { defineCatalog } from "@json-render/core";import { schema } from "@json-render/vue/schema";import { z } from "zod";
export const catalog = defineCatalog(schema, {  components: {    Card: {      props: z.object({ title: z.string(), description: z.string().nullable() }),      slots: ["default"],      description: "A card container",    },    Layout: {      props: z.object({}),      slots: ["default", "header", "footer"],      description: "Layout with named content regions",    },    Button: {      props: z.object({ label: z.string(), action: z.string() }),      description: "A clickable button",    },  },  actions: {},});

Define Registry with h() Render Functions

typescript
import { h } from "vue";import { defineRegistry } from "@json-render/vue";import { catalog } from "./catalog";
export const { registry } = defineRegistry(catalog, {  components: {    Card: ({ props, children }) =>      h("div", { class: "card" }, [        h("h3", null, props.title),        props.description ? h("p", null, props.description) : null,        children,      ]),    Layout: ({ slots }) =>      h("div", null, [        h("header", null, slots.header?.()),        h("main", null, slots.default?.()),        h("footer", null, slots.footer?.()),      ]),    Button: ({ props, emit }) =>      h("button", { onClick: () => emit("press") }, props.label),  },});

Named Slots

Use children for the "default" slot. Use the element's top-level slots object for other slot names declared by the catalog:

json
{  "type": "Layout",  "props": {},  "children": ["main"],  "slots": {    "header": ["heading"],    "footer": ["actions"]  }}

Registry components receive Vue-native slot functions. Render them with slots.header?.(), slots.footer?.(), and so on. slots.default?.() renders the spec's children; the children context field is a convenience alias for that rendered result. In the JSON spec, keep default content in children rather than adding a default entry to slots.

Render Specs

vue
<script setup lang="ts">import { StateProvider, ActionProvider, Renderer } from "@json-render/vue";import { registry } from "./registry";
const spec = { root: "card-1", elements: { /* ... */ } };</script>
<template>  <StateProvider :initial-state="{ form: { name: '' } }">    <ActionProvider :handlers="{ submit: handleSubmit }">      <Renderer :spec="spec" :registry="registry" />    </ActionProvider>  </StateProvider></template>

Providers

ProviderPurpose
StateProviderShare state across components (JSON Pointer paths). Accepts initialState or store for controlled mode.
ActionProviderHandle actions dispatched via the event system
VisibilityProviderEnable conditional rendering based on state
ValidationProviderForm field validation

Composables

ComposablePurpose
useStateStore()Access state context (state as ShallowRef, get, set, update)
useStateValue(path)Get single value from state
useIsVisible(condition)Check if a visibility condition is met
useActions()Access action context
useAction(binding)Get a single action dispatch function
useFieldValidation(path, config)Field validation state
useBoundProp(propValue, bindingPath)Two-way binding for $bindState/$bindItem

Note: useStateStore().state returns a ShallowRef<StateModel> — use state.value to access.

External Store (StateStore)

Nested lists can set repeat.statePath to { "$item": "field" } inside an enclosing repeat.

Pass a StateStore to StateProvider to wire json-render to Pinia, VueUse, or any state management:

typescript
import { createStateStore, type StateStore } from "@json-render/vue";
const store = createStateStore({ count: 0 });
vue
<StateProvider :store="store">  <Renderer :spec="spec" :registry="registry" /></StateProvider>

Dynamic Prop Expressions

Props support $state, $bindState, $cond, $template, $computed. Use { "$bindState": "/path" } on the natural value prop for two-way binding.

Visibility Conditions

typescript
{ "$state": "/user/isAdmin" }{ "$state": "/status", "eq": "active" }{ "$state": "/maintenance", "not": true }[ cond1, cond2 ]  // implicit AND

Built-in Actions

setState, pushState, removeState, and validateForm are built into the Vue schema and handled by ActionProvider:

json
{  "action": "setState",  "params": { "statePath": "/activeTab", "value": "settings" }}

Event System

Components use emit(event) to fire events, or on(event) for metadata (shouldPreventDefault, bound).

Streaming

useUIStream and useChatUI return Vue Refs for streaming specs from an API.

BaseComponentProps

For catalog-agnostic reusable components:

typescript
import type { BaseComponentProps } from "@json-render/vue";
const Card = ({ props, children }: BaseComponentProps<{ title?: string }>) =>  h("div", null, [props.title, children]);

Key Exports

ExportPurpose
defineRegistryCreate a type-safe component registry from a catalog
RendererRender a spec using a registry
schemaElement tree schema (from @json-render/vue/schema)
StateProvider, ActionProvider, VisibilityProvider, ValidationProviderContext providers
useStateStore, useStateValue, useBoundPropState composables
useActions, useActionAction composables
useFieldValidation, useIsVisibleValidation and visibility
useUIStream, useChatUIStreaming composables
createStateStoreCreate in-memory StateStore
BaseComponentPropsCatalog-agnostic component props type

来源与署名

来源:vercel-labs/json-render位于skills/vue提交fc2a696

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架