Skip to content

Form 表单

综合表单

html
<vz-form ref="fromRef" :model="formData" :rules="formRules" message-type="undertext">
  <vz-form-item label="用户" prop="username">
    <vz-input v-model="formData.username" placeholder="请输入用户名" type="text" clearable />
  </vz-form-item>

  <vz-form-item label="密码" prop="password">
    <vz-input v-model="formData.password" placeholder="请输入密码" type="password" password-showable clearable />
  </vz-form-item>

  <vz-form-item label="技能" prop="skill">
    <vz-checkbox-group v-model="formData.skill" group-gap="50rpx">
      <vz-checkbox value="html" label="HTML"></vz-checkbox>
      <vz-checkbox value="css" label="CSS"></vz-checkbox>
      <vz-checkbox value="javascript" label="JAVASCRIPT"></vz-checkbox>
    </vz-checkbox-group>
  </vz-form-item>

  <vz-form-item label="简介" prop="brief" label-position="top">
    <vz-textarea v-model="formData.brief" placeholder="请输入个人简介" maxlength="50" show-word-limit></vz-textarea>
  </vz-form-item>

  <vz-form-item prop="agreement" :border="false" i-class="agreement">
    <vz-checkbox v-model="formData.agreement">
      <text>已阅读并同意</text>
      <text @click.stop>《用户条款》</text>
      <text>与</text>
      <text @click.stop>《隐私协议》</text>
    </vz-checkbox>
  </vz-form-item>
</vz-form>

<vz-button block @click="handleSubmit">提交</vz-button>
<vz-button block @click="handleClear">清空校验</vz-button>
<vz-button block @click="handleReset">重置</vz-button>
typescript
import { reactive, ref } from "vue";

const formData = reactive({
  username: "",
  password: "",
  skill: [],
  brief: "",
  agreement: false,
});

const formRules = reactive({
  username: [
    { required: true, message: "请输入用户名", trigger: "blur" },
    { min: 6, max: 10, message: "用户名 6-10 位", trigger: "blur" },
  ],
  password: [
    { required: true, message: "请输入密码", trigger: "blur" },
    { min: 6, max: 10, message: "密码 6-10 位", trigger: "blur" },
  ],
  skill: [{ required: true, type: "array", min: 1, message: "请至少选择一个技能" }],
  brief: [{ required: true, message: "请输入个人简介", trigger: "blur" }],
  agreement: [
    {
      type: "boolean",
      message: "请阅读并同意《用户条款》与《隐私协议》",
      validator: (rule: any, value: any, callback: any) => (value ? callback() : callback(rule.message)),
    },
  ],
});

const fromRef = ref();

// async/await
async function handleSubmit() {
  try {
    const valid = await fromRef.value?.validate();
    if (valid) {
      console.log("submit!");
    }
  } catch (err) {
    const { errors, fields } = err as any;
    if (errors?.length) {
      console.log(errors, fields);
    }
  }
}

function handleClear() {
  fromRef.value?.clearValidate();
}

function handleReset() {
  fromRef.value?.resetFields();
}

// then/catch
/* function handleSubmit() {
  fromRef.value
    ?.validate()
    .then((valid: boolean) => {
      if (valid) {
        console.log("submit!");
      }
    })
    .catch((err: any) => {
      const { errors, fields } = err;
      if (errors?.length) {
        console.log(errors, fields);
      }
    });
} */

// callback
/* function handleSubmit() {
  fromRef.value?.validate((valid: boolean, err?: any) => {
    if (valid) {
      console.log("submit!");
    } else if (err) {
      const { errors, fields } = err;
      if (errors?.length) {
        console.log(errors, fields);
      }
    }
  });
} */

校验规则参考 async-validator

Form Props

属性名说明类型默认值
model表单数据对象Object-
rules表单验证规则Object-
readonly该表单内的所有组件是否都设为只读。 如果设置为 true, 它将覆盖内部组件的 readonly 属性booleanfalse
disabled是否禁用该表单内的所有组件。 如果设置为 true, 它将覆盖内部组件的 disabled 属性booleanfalse
label-width标签宽度string / number-
label-position标签位置left / topleft
label-align标签对齐方式left / rightleft
label-color标签字体颜色string-
required-hide是否隐藏必填字段的星号booleanfalse
required-holder非必填标签星号占位,为了使文字对齐booleantrue
required-position必填星号在标签文字的左侧或右侧left / rightleft
message-type错误的提示方式toast / undertext / nonenone
border-feedback校验错误时,边框是否变为错误样式booleanfalse
i-class根节点样式类string-
i-style根节点样式Object-

Form Slots

插槽名说明
default默认插槽

Form Exposes

名称说明参数
validate对整个表单的内容进行验证。 接收一个回调函数,或返回 Promise(callback?: FormValidateCallback) => Promise<boolean>
validateField验证具体的指定字段(props: MaybeArray<string>, callback?: FormValidateCallback) => Promise<boolean>
clearValidate清理指定字段的校验结果(props?: MaybeArray<string>) => void
resetFields重置该表单项,将其值重置为初始值,并移除校验结果(props?: MaybeArray<string>) => void

FormItem Props

属性名说明类型默认值
propmodel 的键名,在使用了 validateresetFields 的方法时,该属性是必填的string-
rules表单验证规则MaybeArray<FormItemRule>-
label标签文本string-
label-width标签宽度string / number-
label-position标签位置left / topleft
label-align标签的位置left / rightleft
label-color标签字体颜色string-
required是否为必填项,如不设置,则会根据校验规则确认booleanfalse
border是否显示下边框booleantrue
i-class根节点样式类string-
i-style根节点样式Vue.StyleValue-

FormItem Slots

插槽名说明
default表单内容
label标签内容

FormItem Exposes

名称说明参数
validateState校验状态'' / success / error
validateMessage校验消息string
validate验证表单项(trigger: string, callback?: FormItemValidateCallback) => Promise<boolean>
clearValidate移除该表单项的校验结果() => void
resetField对该表单项进行重置,将其值重置为初始值并移除校验结果() => void

FormItem CSS

变量名说明默认值
--vz-form-item-alignitems-alignflex-start
--vz-form-item-mtmargin-top0
--vz-form-item-mbmargin-bottom0
--vz-form-item-pxpadding-x12rpx
--vz-form-item-border-color下边框颜色--vz-border-color
--vz-form-item-gap标签和内容之间的间距--vz-gap-large
--vz-form-item-label-width标签宽度-
--vz-form-item-label-colorprops.labelColor-
--vz-form-item-label-height标签最小高度--vz-height-base
--vz-form-item-required-color必填星号颜色--vz-color-danger
--vz-form-item-gap-required必填星号和标签之间的间距0
--vz-form-item-error-size错误信息字体大小24rpx
--vz-form-item-error-color错误信息字体颜色--vz-color-danger

FormItem SCSS

scss
$form-item: (
  "px": 12rpx,
  "label-height": var(--vz-height-base),
  "border-color": var(--vz-border-color),
  "gap": var(--vz-gap-large),
  "required-color": var(--vz-color-danger),
  "error-size": 24rpx,
  "error-color": var(--vz-color-danger),
);