Skip to content

n-form 表单容器 ​

纵向堆叠 n-form-item 表单行,统一管理标签布局(位置 / 对齐 / 宽度)与校验规则。页面自持数据对象(model 只读取值参与校验,不回写),提交前经组件 ref 调用 validate 整表校验,首个错误按条目在模板中的顺序返回。

  1. 数据归页面:表单不复制、不回写 model,输入控件照常 :model-value + @update:model-value 受控使用
  2. 校验规则两处可放:表单级 rules(Map,按字段名索引)与条目级 rules(同名字段条目级优先)
  3. 已有错误的字段在值变化后自动重校验(纠错即清),未触发过校验的字段不主动报错

平台兼容性 ​

App H5 微信小程序 支付宝小程序 百度小程序 头条小程序 QQ小程序
√ √ √ × × × ×

API ​

属性 ​

参数 说明 类型 默认值 可选值
model 表单数据对象(只读取值参与校验,不回写);字段值变化后已有错误的字段自动重校验。支持 a.b 点路径取嵌套值 UTSJSONObject null -
rules 表单级校验规则表(键 = 条目 prop 名);同名字段的条目级 rules 优先于本表 Map<string, NFormRule[]> null -
label-position 标签位置:left 水平排在控件左侧,top 堆叠在控件上方 String left left / top
label-align 水平排列时标签文字对齐 String left left / center / right
label-valign 水平排列时标签相对控件的纵向对齐(控件为多行内容时生效) String center top / center / bottom
label-width 标签宽度 px(水平排列时生效,top 时标签占满整行) Number 80 -
label-style 标签行内样式(表单级默认,条目非空 label-style 覆盖),如 "font-weight:600" String "" 与 css 相同
border-bottom 条目行底分隔线(条目可覆盖) Boolean true -
show-asterisk 显示必填星号(条目 required 或规则含 required 时渲染) Boolean true -
asterisk-position 必填星号位置 String left left / right
show-message error-type 为 message 时显示条目错误文字(条目可覆盖) Boolean true -
error-type 错误展示通道:message 控件下方错误文字 / toast 轻提示(校验首个错误)/ border-bottom 行底红线 / none 只回调不展示 String message message / toast / border-bottom / none
disabled 整表禁用:透明遮罩盖住表单拦截全部交互(已聚焦的输入框到失焦才收键盘) Boolean false -
custom-class 挂到根节点的额外 class(类需定义在组件样式表内) String "" -
custom-style 根节点行内样式,如 "margin:0 15px" 用于表单两侧留白 String "" 与 css 相同

事件 ​

无(校验结果经 validate 回调返回,见下方方法)。

方法(经组件 ref 调用) ​

方法名 说明 参数
validate 整表校验:按条目模板顺序逐字段校验,error-type 为 toast 时轻提示首个错误 callback: (valid: boolean, errors: Array<NFormError>) => void
validateField 校验单个字段,返回错误信息(null = 通过) prop: string
clearValidate 清除校验错误;传空数组清除全部 props: string[]

插槽 ​

插槽名 说明
default 表单行内容(通常是若干 n-form-item)

规则类型 NFormRule ​

字段 说明 类型 默认值
required 必填:值为 null、空串或空数组时未通过 Boolean false
message 未通过时的错误信息;留空用内置文案(走语言包) String ""
min 数值比大小、字符串与数组比长度 Number -
max 数值比大小、字符串与数组比长度 Number -
pattern 正则校验(对值转字符串后匹配) RegExp -
validator 自定义校验函数:返回 true 通过;返回字符串即错误信息;返回 false 取 message 或内置文案 (value) => boolean | string -

逐条按序执行,首条未通过即终止;值为空且未声明 required 时跳过其余校验(非必填字段允许留空)。

实现说明 ​

机制对照(参考源并集 → 本库实现):

  1. 规则模型取类型化方案(required / message / min / max / pattern / validator),字符串规则名(正则集合写死在库内)不收——正则与函数在 uts 下一等支持,用户自写 pattern 即等价表达
  2. 错误展示通道为并集:message 条目下方文字(默认)/ toast 轻提示(整表校验时 uni.showToast,全端可用零依赖)/ border-bottom 行底红线 / none 只回调;参考源自绘的错误提示浮层不收(toast 通道已覆盖其场景)
  3. 整表禁用用透明遮罩(常驻节点 + v-show):对任意插槽内容立即生效、零耦合;"成员控件读表单上下文自行禁用"的路线要求全部控件配合注入,跨组件耦合不收
  4. 条目点击事件不提供:行内通常内嵌输入控件,App 端父容器交互绑定会拦截子控件触摸、输入法唤不起(行组件零交互绑定为库内既定纪律);点击语义由行内控件(如选择器触发器)自行承载
  5. 滚动到首个错误不内置:页面滚动容器归页面管(本库页面骨架不提供滚动 API),validate 回调的 errors 按模板顺序排列,errors[0] 即第一个错误,页面可据此自行滚动定位
  6. 原生 form 提交联动(behaviors 注入聚合组件值)不收:uni-app x 不支持 behaviors,表单提交走 validate 回调拿全量 model
  7. 值变化重校验:仅对已有错误的字段生效(纠错即清),不给未触发过校验的字段主动报错;model 传响应式对象(ref / computed / reactive)即生效

记录 · 思考 · 创作