React Native

作者 vercel-labsfc2a696a50a3無授權條款18K 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫昨天更新

React Native renderer for json-render that turns JSON specs into native mobile UIs. Use when working with @json-render/react-native, building React Native UIs from JSON, creating mobile component catalogs, or rendering AI-generated specs on mobile.

精選僅含說明Software Development
AI 產生的概覽

介紹 @json-render/react-native 渲染器,可將 JSON 規格轉換為原生行動端元件樹。

功能
說明如何使用 @json-render/react-native 渲染器把 JSON 規格轉換為原生行動端介面,涵蓋目錄與登錄檔設定、標準版面、內容、輸入、回饋與複合元件、可見性條件、動態屬性表達式、內建動作、Provider 以及主要匯出項目。
適用情境
適用於使用 @json-render/react-native、從 JSON 建構 React Native 介面、建立行動端元件目錄,或在行動端渲染 AI 生成的規格。
執行需求
僅為說明文件,不含指令碼。需要 React Native 專案,並安裝 @json-render/react-native、@json-render/core 與 zod;範例中還引用了 Ionicons。

@json-render/react-native

React Native renderer that converts JSON specs into native mobile component trees with standard components, data binding, visibility, actions, and dynamic props.

Quick Start

typescript
import { defineCatalog } from "@json-render/core";import { schema } from "@json-render/react-native/schema";import {  standardComponentDefinitions,  standardActionDefinitions,} from "@json-render/react-native/catalog";import { defineRegistry, Renderer, type Components } from "@json-render/react-native";import { z } from "zod";
// Create catalog with standard + custom componentsconst catalog = defineCatalog(schema, {  components: {    ...standardComponentDefinitions,    Icon: {      props: z.object({ name: z.string(), size: z.number().nullable(), color: z.string().nullable() }),      slots: [],      description: "Icon display",    },  },  actions: standardActionDefinitions,});
// Register only custom components (standard ones are built-in)const { registry } = defineRegistry(catalog, {  components: {    Icon: ({ props }) => <Ionicons name={props.name} size={props.size ?? 24} />,  } as Components<typeof catalog>,});
// Renderfunction App({ spec }) {  return (    <StateProvider initialState={{}}>      <VisibilityProvider>        <ActionProvider handlers={{}}>          <Renderer spec={spec} registry={registry} />        </ActionProvider>      </VisibilityProvider>    </StateProvider>  );}

Standard Components

Layout

  • Container - wrapper with padding, background, border radius
  • Row - horizontal flex layout with gap, alignment
  • Column - vertical flex layout with gap, alignment
  • ScrollContainer - scrollable area (vertical or horizontal)
  • SafeArea - safe area insets for notch/home indicator
  • Pressable - touchable wrapper that triggers actions on press
  • Spacer - fixed or flexible spacing
  • Divider - thin line separator

Content

  • Heading - heading text (levels 1-6)
  • Paragraph - body text
  • Label - small label text
  • Image - image display with sizing modes
  • Avatar - circular avatar image
  • Badge - small status badge
  • Chip - tag/chip for categories

Input

  • Button - pressable button with variants
  • TextInput - text input field
  • Switch - toggle switch
  • Checkbox - checkbox with label
  • Slider - range slider
  • SearchBar - search input

Feedback

  • Spinner - loading indicator
  • ProgressBar - progress indicator

Composite

  • Card - card container with optional header
  • ListItem - list row with title, subtitle, accessory
  • Modal - bottom sheet modal

Visibility Conditions

Use visible on elements. Syntax: { "$state": "/path" }, { "$state": "/path", "eq": value }, { "$state": "/path", "not": true }, [ cond1, cond2 ] for AND.

Pressable + setState Pattern

Use Pressable with the built-in setState action for interactive UIs like tab bars:

json
{  "type": "Pressable",  "props": {    "action": "setState",    "actionParams": { "statePath": "/activeTab", "value": "home" }  },  "children": ["home-icon", "home-label"]}

Dynamic Prop Expressions

Any prop value can be a data-driven expression resolved at render time:

  • { "$state": "/state/key" } - reads from state model (one-way read)
  • { "$bindState": "/path" } - two-way binding: use on the natural value prop (value, checked, pressed, etc.) of form components.
  • { "$bindItem": "field" } - two-way binding to a repeat item field. Use inside repeat scopes.
  • Nested lists use { "repeat": { "statePath": { "$item": "comments" } } } inside an enclosing repeat.
  • { "$cond": <condition>, "$then": <value>, "$else": <value> } - conditional value
json
{  "type": "TextInput",  "props": {    "value": { "$bindState": "/form/email" },    "placeholder": "Email"  }}

Components do not use a statePath prop for two-way binding. Use { "$bindState": "/path" } on the natural value prop instead.

Built-in Actions

The setState action is handled automatically by ActionProvider and updates the state model directly, which re-evaluates visibility conditions and dynamic prop expressions:

json
{ "action": "setState", "actionParams": { "statePath": "/activeTab", "value": "home" } }

Providers

ProviderPurpose
StateProviderShare state across components (JSON Pointer paths). Accepts optional store prop for controlled mode.
ActionProviderHandle actions dispatched from components
VisibilityProviderEnable conditional rendering based on state
ValidationProviderForm field validation

External Store (Controlled Mode)

Pass a StateStore to StateProvider (or JSONUIProvider / createRenderer) to use external state management:

tsx
import { createStateStore, type StateStore } from "@json-render/react-native";
const store = createStateStore({ count: 0 });
<StateProvider store={store}>{children}</StateProvider>
store.set("/count", 1); // React re-renders automatically

When store is provided, initialState and onStateChange are ignored.

Key Exports

ExportPurpose
defineRegistryCreate a type-safe component registry from a catalog
RendererRender a spec using a registry
schemaReact Native element tree schema
standardComponentDefinitionsCatalog definitions for all standard components
standardActionDefinitionsCatalog definitions for standard actions
standardComponentsPre-built component implementations
createStandardActionHandlersCreate handlers for standard actions
useStateStoreAccess state context
useStateValueGet single value from state
useBoundPropTwo-way state binding via $bindState/$bindItem
useStateBinding(deprecated) Legacy two-way binding by path
useActionsAccess actions context
useActionGet a single action dispatch function
useUIStreamStream specs from an API endpoint
createStateStoreCreate a framework-agnostic in-memory StateStore
StateStoreInterface for plugging in external state management

來源與署名

來源:vercel-labs/json-render位於skills/react-native提交fc2a696

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架