更新记录

0.1.0(2026-10-20) 下载此版本

  • 初版 nax-form-render 动态表单渲染器:由 schema(JSON 字符串 / 字段数组 / 含 fields 的对象)渲染表单项,required 自动生成校验规则
  • 内部组合 nax-form + nax-form-item,标签、错误展示、字段注册与校验链路与手写表单完全一致;字段增删由 nax-form-item 的 prop watch 自动注册/注销
  • 支持 16 类控件:text / password / number-input / digit / tel / textarea / search / select / switch / radio / checkbox / checkbox-group / number / slider / rate / date / datetime / time / year-month / calendar / date-strip
  • 控件类型为封闭枚举:受蒸汽模式渲染机制约束(模板编译期静态分析,h() / resolveComponent() 在 App 的 Vapor 模式不支持),渲染分支在源码内以 v-if / v-else-if 穷举;schema 出现枚举外的 type 时渲染可诊断提示而非静默空白
  • 值回写统一走 :model-value + @update:model-value(v-for 内无法把 v-model 绑定到动态 key)。不用 @change 取值:各控件载荷不统一(nax-select / nax-datetime-picker 的 change 回传结构化数组/对象,nax-input / nax-textarea / nax-search 的 change 是「失焦且与聚焦时不同」语义)
  • 端差异处理(#ifdef APP-ANDROID || APP-IOS || APP-HARMONY):schema 解析读字段在 App 端走 UTSJSONObject API,Web / 小程序走字段访问
  • 按控件类型分派初值:开关 false、多选 []、数字类取 min、其余空串,避免控件拿到类型不符的值
  • nax-calendar 无 modelValue,值取 change 载荷的 result,初值走 default-date
  • 弹层类控件(datetime-picker / calendar)清除时同步复位展示文案
  • Methods:validate / validateField / resetFields / clearValidate / setSchema(运行时替换 schema 并保留同名字段已有值)/ getModel
  • Events:update:modelValue / change(带 prop)/ confirm / open / close
  • demo:pages/components/form-render

平台兼容性

uni-app x(4.25)

Chrome Safari Android iOS 鸿蒙 微信小程序
√ √ √ √ √ √

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
× √ × ×

nax-form-render

uni-app x 动态表单渲染器:由 schema(JSON 字符串 / 数组 / 对象)渲染出不同的表单项,校验规则同步生成。

依赖

依赖 说明
nax-form / nax-form-item 表单容器与表单项(标签、错误展示、校验链路)
nax-input / nax-textarea / nax-search / nax-select 文本与选择类控件
nax-switch / nax-radio / nax-checkbox 开关与勾选类控件
nax-number-box / nax-slider / nax-rate 数值类控件
nax-datetime-picker / nax-calendar / nax-date-strip 日期时间类控件
nax-icon / nax-ui-theme 图标与主题 token(运行时弱依赖)

基础用法

<nax-form-render
  ref="formRef"
  v-model="formValue"
  :schema="schema"
  @change="onChange"
></nax-form-render>
const schema = `[
  { "prop": "account", "label": "账号", "type": "text", "placeholder": "4-12 位", "required": true },
  { "prop": "role", "label": "角色", "type": "select", "required": true,
    "options": [ { "value": "dev", "label": "开发" }, { "value": "ops", "label": "运维" } ] },
  { "prop": "notify", "label": "接收通知", "type": "switch" }
]`

const formValue = ref({} as UTSJSONObject)
const formRef = ref(null as ComponentPublicInstance | null)

function onSubmit() {
  const p = formRef.value!.validate() as Promise<boolean>
  p.then((_ok : boolean) => {
    // 通过校验,读取值:formRef.value!.getModel()
  }).catch((_err : any | null) => {
    // 校验失败,字段错误已由 nax-form-item 展示
  })
}

schema 也可以传数组([{...}])或含 fields 数组的对象,三者在解析层等价。

控件类型

控件类型是封闭枚举——受 uni-app x 蒸汽模式渲染机制约束:模板在编译期静态分析,不支持运行期构造组件(h() / resolveComponent() 在 App 的 Vapor 模式均不支持),因此渲染分支在组件源码内以 v-if / v-else-if 穷举。新增类型需要修改组件源码,不能由 schema 引入任意组件。

type 控件 值类型
text / password / number-input / digit / tel nax-input(按 type 切换键盘) string
textarea nax-textarea string
search nax-search string
select nax-select(内置触发条) string
switch nax-switch boolean
radio nax-radio-group + nax-radio string
checkbox nax-checkbox(单勾) boolean
checkbox-group nax-checkbox-group + nax-checkbox string[]
number nax-number-box number
slider nax-slider number
rate nax-rate number
date / datetime / time / year-month nax-datetime-picker(内置触发条) string
calendar nax-calendar(组件自渲染触发条) string
date-strip nax-date-strip(行内,无弹层) string

schema 里出现枚举外的 type 时,该字段会渲染为可诊断的提示文案(而非静默空白),便于排查。

字段配置(schema)

字段 类型 说明
prop string 必填,字段名;对应表单值的 key,也是校验的 prop
label string 标签文案;缺省用 prop
type string 控件类型,见上表;缺省 text
placeholder string 占位文案
required boolean 必填;为 true 时自动生成 required 规则并显示星号
disabled boolean 禁用该字段
options array select / radio / checkbox-group 的选项:[{ value, label, disabled? }]
min / max number 数值类下限 / 上限(number / slider / rate;rate 的 max 即星数)
step number 步长(number / slider)
maxlength number 文本最大长度(textarea,缺省 200)
rules array 该字段校验规则;存在时取代由 required 生成的那条
trigger string | string[] 校验触发时机;缺省 ['blur', 'change']
minDate / maxDate string 日期类可选范围(date / datetime / time / year-month / calendar / date-strip)
showSecond boolean datetime / time 是否显示秒列
tip string 提示文案,展示在控件下方

date-strip 的 minDate / maxDate 只接受日期字符串(组件内只识别 Date 与字符串),传时间戳数字会静默失效。

Props

属性 类型 默认 说明
schema string | array | object '' 字段配置
modelValue object {} v-model 表单值;传入的初值会补齐内部空字段(不覆盖已改值)
rules object {} 额外校验规则;与 schema 生成的规则合并,同字段以本 prop 优先
error-type string message message / toast / border-bottom / none
border-bottom boolean true 表单项下边框
label-position string left left / top
label-width string | number 80 标签宽度(px)
label-align string left left / center / right
label-size string | number '' 标签字号(px);空串跟随组件默认 15
disabled boolean false 整体禁用(与字段级 disabled 取或)
custom-class string '' 根节点扩展 class

Events

事件 载荷 说明
update:modelValue UTSJSONObject 表单值变化(v-model)
change { prop, value, model } 表单值变化;prop 为触发字段
confirm { prop, value, model } 确认类控件确认(datetime / calendar)
open / close string(字段名) 弹层类控件显隐(calendar)

Methods(ref)

方法 说明
validate() 校验全部字段,返回 Promise<boolean>;失败 reject 错误数组
validateField(props?, event?) 校验指定字段
resetFields() 重置为 schema 初始值并清空错误
clearValidate(props?) 清空校验结果
setSchema(schema) 运行时替换 schema;保留同名字段的已有值,字段增删自动处理
getModel() 读取当前表单值(UTSJSONObject)

setSchema 之后会自动 clearValidate,避免已移除字段的错误残留。

值回写与校验

  • 控件统一用 :model-value + @update:model-value 回写,不使用 v-model:v-for 内无法把 v-model 绑定到动态 key。
  • 之所以不用 @change 取值:各控件载荷不统一(例如 nax-select 的 change 回传的是选中项数组 [{value,label,index}],nax-input 的 change 仅在失焦且内容变化时触发)。update:modelValue 才是统一的「值已变化」信号。
  • 字段级校验无需手动触发:控件在值变化 / 失焦时回调 nax-form-item,规则里的 trigger 自动生效。

平台说明

  • select / datetime-picker 在微信小程序端可映射模式会走微信系统弹层(v-model:show 不生效,点击内置触发条弹出);datetime / month-day / time + 秒无法映射,保持自建弹层。详见各控件 readme。
  • date-strip 的 minDate / maxDate 需传日期字符串(见上)。
  • calendar 无内置触发条,组件自渲染触发条以驱动弹层显隐;其 @change 载荷为对象,组件取 result 字段作为值。

主题

通过 CSS 变量覆盖(沿用 nax-ui 主题体系):

Token 用途
--nax-color-bg / --nax-color-bg-hover 触发条背景 / 按压态
--nax-color-border 触发条边框
--nax-color-text / --nax-color-text-secondary / --nax-color-text-placeholder 文字色
--nax-color-error 未知类型提示
--nax-radius-md / --nax-border-width / --nax-space-3 / --nax-font-size-md 圆角 / 边框 / 内距 / 字号

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。