当前位置: 首页 > news >正文

【Vercel实用Skill】json-render-react-native 技能

json-render的React Native渲染器,将JSON规范转换为原生移动UI。当使用@json-render/react-native、从JSON构建React Native UI、创建移动组件目录或在移动设备上渲染AI生成的规范时使用此技能。

技能概述

json-render-react-native 技能是一个专门用于移动应用开发的渲染器,它将JSON规范转换为React Native组件树。这个技能非常适合构建跨平台的移动应用UI,支持标准组件、数据绑定、可见性条件、操作和动态属性。通过定义JSON规范,开发者可以快速创建原生移动界面,无需编写大量的原生代码。

下载地址:https://github.com/vercel-labs/json-render

主要功能

  • 原生移动UI渲染: 将JSON规范转换为React Native组件树
  • 标准组件库: 提供布局、内容、输入、反馈和复合组件
  • 数据绑定: 支持单向和双向数据绑定
  • 可见性条件: 基于状态的条件渲染
  • 动态属性表达式: 支持在运行时解析的动态属性
  • 内置操作: 自动处理setState等内置操作
  • 状态管理: 支持外部状态管理库集成

触发条件

在以下情况下应该调用此技能:

  • 用户需要使用@json-render/react-native包
  • 需要从JSON构建React Native UI
  • 需要创建移动组件目录
  • 需要在移动设备上渲染AI生成的规范
  • 需要构建跨平台移动应用

标准组件

布局组件

  • Container: 包装器,支持padding、background、border radius
  • Row: 水平弹性布局,支持gap、alignment
  • Column: 垂直弹性布局,支持gap、alignment
  • ScrollContainer: 可滚动区域(垂直或水平)
  • SafeArea: 安全区域插入,用于刘海屏/底部指示器
  • Pressable: 可触摸包装器,在按下时触发操作
  • Spacer: 固定或灵活的间距
  • Divider: 细线分隔符

内容组件

  • Heading: 标题文本(级别1-6)
  • Paragraph: 正文文本
  • Label: 小标签文本
  • Image: 图像显示,支持多种尺寸模式
  • Avatar: 圆形头像图像
  • Badge: 小状态徽章
  • Chip: 分类标签/芯片

输入组件

  • Button: 可按下按钮,支持变体
  • TextInput: 文本输入字段
  • Switch: 切换开关
  • Checkbox: 复选框
  • Slider: 范围滑块
  • SearchBar: 搜索输入

反馈组件

  • Spinner: 加载指示器
  • ProgressBar: 进度指示器

复合组件

  • Card: 卡片容器,可选标题
  • ListItem: 列表行,包含title、subtitle、accessory
  • Modal: 底部抽屉模态框

处理过程

1. 创建目录

使用标准组件定义创建移动应用目录:

import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/react-native/schema";
import {
standardComponentDefinitions,
standardActionDefinitions,
} from "@json-render/react-native/catalog";
import { z } from "zod";

const catalog = defineCatalog(schema, {
components: {
...standardComponentDefinitions,
Icon: {
props: z.object({
name: z.string(),
size: z.number().nullable(),
color: z.string().nullable(),
}),
slots: [],
description: "图标显示",
},
},
actions: standardActionDefinitions,
});

2. 定义注册表

注册自定义组件实现:

import { defineRegistry, type Components } from "@json-render/react-native";

const { registry } = defineRegistry(catalog, {
components: {
Icon: ({ props }) => <Ionicons name={props.name} size={props.size ?? 24} />,
} as Components<typeof catalog>,
});

3. 渲染应用

使用Provider和Renderer渲染应用:

import {
Renderer,
StateProvider,
VisibilityProvider,
ActionProvider
} from "@json-render/react-native";

function App({ spec }) {
return (
<StateProvider initialState={{}}>
<VisibilityProvider>
<ActionProvider handlers={{}}>
<Renderer spec={spec} registry={registry} />
</ActionProvider>
</VisibilityProvider>
</StateProvider>
);
}

动态属性表达式

任何属性值都可以是在运行时解析的动态表达式:

  • {"{ \"$state\": \"/state/key\" }"}: 从状态模型读取值(单向读取)
  • {"{ \"$bindState\": \"/path\" }"}: 双向绑定,用于表单组件的自然值属性
  • {"{ \"$bindItem\": \"field\" }"}: 双向绑定到重复项字段
  • {"{ \"$cond\": <condition>, \"$then\": <value>, \"$else\": <value> }"}: 条件值

{ "type": "TextInput", "props": { "value": { "$bindState": "/form/email" }, "placeholder": "邮箱" } }

可见性条件

使用visible属性基于状态控制元素显示:

  • {"{ \"$state\": \"/path\" }"}: 真值检查
  • {"{ \"$state\": \"/path\", \"eq\": value }"}: 相等检查
  • {"{ \"$state\": \"/path\", \"not\": true }"}: 否定检查
  • [cond1, cond2]: 隐式AND

Pressable + setState模式

使用Pressable与内置setState操作创建交互式UI:

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

Provider说明

Provider用途
StateProvider在组件间共享状态(JSON Pointer路径)。接受可选的store属性用于受控模式。
ActionProvider处理从组件分发的操作
VisibilityProvider启用基于状态的条件渲染
ValidationProvider表单字段验证

外部状态存储(受控模式)

传递StateStore到StateProvider以使用外部状态管理:

import { createStateStore, type StateStore } from "@json-render/react-native";

const store = createStateStore({ count: 0 });

<StateProvider store={store}>{children}</StateProvider>

store.set("/count", 1); // React自动重新渲染

关键导出

导出用途
defineRegistry从目录创建类型安全的组件注册表
Renderer使用注册表渲染规范
schemaReact Native元素树模式
standardComponentDefinitions所有标准组件的目录定义
standardActionDefinitions标准操作的目录定义
standardComponents预构建的组件实现
createStandardActionHandlers为标准操作创建处理程序
useStateStore访问状态上下文
useStateValue从状态获取单个值
useBoundProp通过$bindState/$bindItem进行双向状态绑定
useActions访问操作上下文
useAction获取单个操作分发函数
useUIStream从API端点流式传输规范
createStateStore创建框架无关的内存StateStore
StateStore用于插入外部状态管理的接口

使用示例

示例: 创建简单的登录表单

const loginFormSpec = {
root: "container",
elements: {
container: {
type: "Container",
props: {
padding: 20,
backgroundColor: "#f5f5f5"
},
children: ["heading", "emailInput", "passwordInput", "loginButton"]
},
heading: {
type: "Heading",
props: {
text: "登录",
level: 1
},
children: []
},
emailInput: {
type: "TextInput",
props: {
placeholder: "邮箱",
value: { "$bindState": "/form/email" },
keyboardType: "email-address",
autoCapitalize: "none"
},
children: []
},
passwordInput: {
type: "TextInput",
props: {
placeholder: "密码",
value: { "$bindState": "/form/password" },
secureTextEntry: true
},
children: []
},
loginButton: {
type: "Button",
props: {
label: "登录",
variant: "primary",
disabled: {
"$cond": {
"$or": [
{ "$state": "/form/email", "eq": "" },
{ "$state": "/form/password", "eq": "" }
]
},
"$then": true,
"$else": false
}
},
on: {
"press": { "action": "submit" }
},
children: []
}
}
};

最佳实践

  1. 使用SafeArea: 在应用顶部和底部使用SafeArea组件处理刘海屏和底部指示器
  2. 状态管理: 使用$bindState进行表单输入的双向绑定
  3. 条件渲染: 使用visible属性控制组件的显示和隐藏
  4. 性能优化: 对于长列表,考虑使用虚拟化列表组件
  5. 样式一致性: 在目录中定义统一的样式主题
  6. 操作处理: 使用ActionProvider集中处理用户交互
http://www.jsqmd.com/news/707813/

相关文章:

  • 银泰百货卡变现技巧:教你如何卖出最高价! - 团团收购物卡回收
  • 佛山定制楼梯技术分享:适配、安全与性价比全解析 - 资讯焦点
  • 3.1 建筑给水排水与供暖工程施工技术
  • 终极指南:30倍提速!百度网盘直链解析工具轻松突破限速
  • 基础数据结构——栈和队列
  • 04 | 笔试算法题:凑最长不重复字符串的数目问题
  • 告别台架依赖:SkyEyeCANoe实现汽车CAN通信软件在环验证
  • G-Helper风扇控制终极指南:如何为你的ROG笔记本定制完美散热方案
  • 中山定制楼梯品牌怎么选?技术维度拆解靠谱标准 - 资讯焦点
  • .NET SqlSugar 仓储、工作单元、服务层
  • MCP 2026多租户隔离配置失效的5种静默形态,如何用1条kubectl命令+3行Prometheus告警规则实时捕获?
  • 想给照片换背景?这几款工具 + 1个微信小程序的搭配建议
  • 你的公司Wi-Fi总被蹭?可能是缺了这台“看门人”:手把手搭建AD域控实现802.1x认证
  • WPS 通配符神技:一键上标参考文献 + 中英文自动加空格
  • 2026年如何高效降低AI率?6款最新低成本降AI率工具实测(附独家指令) - 降AI实验室
  • 佛山定制楼梯品牌选型指南:技术维度拆解与实测参考 - 资讯焦点
  • 告别依赖冲突!手把手教你从源码编译libfranka 0.10.0与franka_ros(附特定版本切换指南)
  • KoGPT大模型推理加速:FasterTransformer优化实践
  • 换季总感冒发烧怎么回事?乳贝初接骨木莓配方,筑免疫防线 - 资讯焦点
  • TileKernels从入门到精通
  • 成都青少儿英语培训怎么选才契合孩子需求? - 品牌推荐官方
  • Oracle数据库物化视图概述
  • 中山定制楼梯品牌怎么选?从技术维度拆解核心标准 - 资讯焦点
  • 选择旅游团商家时应从哪些方面考量、如何挑选? - 品牌推荐官方
  • 别再手动调PID了!用STM32 MotorControl Workbench 5.4.4快速搞定FOC电机调试
  • GHelper:轻量级华硕笔记本控制工具完整使用指南
  • CST优化器避坑指南:为什么你的参数优化总不收敛?可能是这5个设置没搞对
  • 白酒品牌究竟该找谁来做?原来背后有这些门道! - 品牌推荐官方
  • GEO 实战教程:从 0 到 1 构建企业 GEO 体系
  • 给新生儿选纸尿裤别踩坑,2026年10大主流品牌盘点 - 资讯焦点