naive happy ui 表单验证

635 阅读1分钟

声明表单对象

const formRef = ref()

声明表单键

const userForm = reactive({
  id             : '',
  tenantId       : '',
  username       : '',
  gender         : '1',
  password       : '',
  passwordConfirm: '',
  nickname       : '',
  phoneNumber    : '',
  avatarUrl      : [],
  des            : '',
  isEnable       : 1
})

验证规则

const rules = {
  username: [
    {
      required: true,
      validator (rule, value) {
        if (!value) {
          return new Error('账号不能为空!')
        } else if (!/^[a-zA-Z0-9]{3,10}$/.test(value)) {
          return new Error('应设置3至10位的账号(字母、数字)!')
        }
        return true
      },
      trigger: [ 'input', 'blur' ]
    }
  ],
  password: [
    {
      required: true,
      validator (rule, value) {
        if (!value) {
          return new Error('密码不能为空!')
        } else if (!/^[a-zA-Z0-9_-]{6,10}$/.test(value)) {
          return new Error('应设置6至10位的密码(字母、数字、下划线、减号)!')
        }
        return true
      },
      trigger: [ 'input', 'blur' ]
    }
  ],
  passwordConfirm: [
    {
      required: true,
      message : '请再次输入密码!',
      trigger : 'blur'
    },
    {
      validator (rule, value) {
        if (userForm.password !== value) {
          return new Error('两次密码输入不一致!')
        }
        return true
      },
      trigger: 'input'
    }
  ],
  nickname: {
    required: true,
    message : '昵称不能为空!',
    trigger : 'blur'
  },
  phoneNumber: [
    {
      required: true,
      validator (rule, value) {
        if (!value) {
          return new Error('手机号不能为空!')
        } else if (!/^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[189]))\d{8}$/.test(value)) {
          return new Error('手机号格式不正确!')
        }
        return true
      },
      trigger: [ 'input', 'blur' ]
    }
  ],
  avatarUrl: [
    {
      required: true,
      validator (rule, value) {
        if (value.length === 0) {
          return new Error('头像不能为空!')
        }
        return true
      },
      trigger: 'blur'
    }
  ]
}

html

<n-modal
    v-model:show="showModal"
    preset="card"
    style="width: 700px"
    title="用户新增"
    :bordered="false"
  >
    <n-form
      ref="formRef"
      :model="userForm"
      :rules="rules"
      label-placement="left"
      label-width="auto"
      require-mark-placement="right-hanging"
    >
      <n-form-item
        label="账号"
        path="username"
      >
        <n-input
          v-model:value="userForm.username"
          placeholder="请输入账号"
        />
      </n-form-item>
      <n-form-item
        label="密码"
        path="password"
      >
        <n-input
          v-model:value="userForm.password"
          type="password"
          placeholder="请输入密码"
        />
      </n-form-item>
      <n-form-item
        label="重复密码"
        path="passwordConfirm"
      >
        <n-input
          v-model:value="userForm.passwordConfirm"
          :disabled="!userForm.password"
          type="password"
          placeholder="请再输入一次密码"
        />
      </n-form-item>
      <n-form-item
        label="昵称"
        path="nickname"
      >
        <n-input
          v-model:value="userForm.nickname"
          placeholder="请输入昵称"
        />
      </n-form-item>
      <n-form-item
        label="手机号"
        path="phoneNumber"
      >
        <n-input
          v-model:value="userForm.phoneNumber"
          placeholder="请输入手机号"
        />
      </n-form-item>
      <n-form-item label="性别">
        <n-radio-group v-model:value="userForm.gender">
          <n-space>
            <n-radio value="1"></n-radio>
            <n-radio value="2"></n-radio>
          </n-space>
        </n-radio-group>
      </n-form-item>
      <n-form-item
        label="头像"
        path="avatarUrl"
      >
        <image-upload-box
          v-model:value="userForm.avatarUrl"
          :max="1"
        />
      </n-form-item>
      <n-form-item label="简介备注">
        <n-input
          v-model:value="userForm.des"
          type="textarea"
          placeholder="请输入简介备注"
          :autosize="{
            minRows: 3,
            maxRows: 5
          }"
        />
      </n-form-item>
      <n-form-item label="状态">
        <n-switch
          v-model:value="userForm.isEnable"
          :checked-value="1"
          :unchecked-value="0"
        >
          <template #checked>
            启用
          </template>
          <template #unchecked>
            禁用
          </template>
        </n-switch>
      </n-form-item>
    </n-form>
    <template #footer>
      <div style="display: flex; justify-content: flex-end">
        <n-button
          type="primary"
          :disabled="subLoading"
          @click="handleSubmit"
        >
          保存
        </n-button>
      </div>
    </template>
  </n-modal>