跳转到正文

RForm 与 useForm ​

RForm 包装 Naive UI Form,并用 Spin 显示提交或查询状态。用 NFormItem.path 匹配 model 的字段,在输入组件上更新值。

tsx
import { RForm, useForm } from "@/components";
import { NButton, NFormItem, NInput } from "naive-ui";
import { defineComponent } from "vue";

export default defineComponent({
  setup() {
    const [register, form] = useForm(
      { name: "" },
      {
        name: {
          key: "name",
          required: true,
          message: "请输入姓名",
          trigger: "blur",
        },
      },
    );
    const rules = form.formRules();
    const submit = async () => {
      await form.validate();
      console.log(form.formConditionRef.value.name);
    };
    return () => (
      <RForm
        onRegister={register}
        model={form.formConditionRef.value}
        rules={rules}
      >
        <NFormItem label="姓名" path="name">
          <NInput
            value={form.formConditionRef.value.name}
            onUpdateValue={(name) => form.updateFormCondition({ name })}
          />
        </NFormItem>
        <NButton onClick={() => void submit().catch(() => {})}>
          校验并提交
        </NButton>
        <NButton onClick={() => form.reset()}>重置</NButton>
      </RForm>
    );
  },
});

属性与事件 ​

除 onSubmit 外,继承 NForm 的公开属性。默认插槽传给 NForm。

属性默认说明
loadingfalse外层 Spin 状态,由调用方开关。
loadingDescription无加载说明。
autocomplete'off'挂载时写到表单 DOM。
submitWhenEnterfalse创建时启用 Enter 捕获,阻止默认行为,校验成功后调用 onFinish。
onFinish无Enter 校验完成回调。自定义提交按钮要自行调用 validate() 并执行提交。
onRegister(inst)无挂载后传出 Naive UI Form 实例。接受单函数或回调数组。

含多行输入、搜索选择器或嵌套表单时,先确认 Enter 是否应被捕获。组件没有把 Form 方法直接暴露为模板 ref。

useForm ​

useForm(model?, rules?) 返回 [register, actions],把 register 绑定给 onRegister。初始化值和规则可用对象或工厂;对象会深拷贝,工厂结果直接使用,建议每次创建新对象。

返回项行为
formConditionRef响应式模型,传给 RForm.model 并用于输入绑定。
formModel() / formRules()重新取得初始模型和规则。
getFormInstance()获取已注册实例,未注册时抛错。
validate(callback?, shouldRuleBeApplied?)透传 Naive UI 校验;失败要处理 Promise 拒绝。
validateTargetField(key)按规则对象的唯一 key 筛选规则,key 不等同于 NFormItem.path。
restoreValidation()清除当前校验状态,保留输入。
updateFormCondition(values)浅合并当前模型,不改初始值。
reset(values?)合并初始值和覆盖值,然后清除校验。动态新增字段不会被自动删除。

实例相关方法要在表单挂载并注册后调用。可空字段应在初始模型中显式声明,并为所用输入选用合适的空值。修改嵌套字段时注意更新是浅合并。

组件源码 · useForm 源码 · 表单示例