Skip to content

Form 表单

由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据

基础用法

包括各种表单项,比如输入框、选择器、开关、单选框、多选框等。

model:
{
  "email": "",
  "password": "",
  "confirm_password": ""
}
<script setup>
import { reactive, ref } from 'vue'
import Form from '@/components/Form/Form.vue'
import FormItem from '@/components/Form/FormItem.vue'
import Input from '@/components/Input/Input.vue'
import Button from '@/components/Button/Button.vue'
import { createMessage } from '@/components/Message/method'

const model = reactive({
  email: '',
  password: '',
  confirm_password: ''
})

const rules = {
  email: [
    { type: 'email', required: true, trigger: 'blur' },
    { type: 'string', required: true, trigger: 'input' }
  ],
  password: [{ type: 'string', required: true, trigger: 'blur', min: 3, max: 6 }],
  confirm_password: [
    { type: 'string', required: true, trigger: 'blur', min: 3, max: 6 },
    { validator: (rule, value) => value === model.password, trigger: 'blur', message: '密码不一致' }
  ]
}

const formRef = ref()
async function submit() {
  try {
    await formRef.value.validate()
    createMessage({
      type: 'success',
      message: '验证通过'
    })
  } catch (e) {
    console.error(e)

    createMessage({
      type: 'danger',
      message: '验证失败'
    })
  }
}
function reset() {
  formRef.value?.resetFields()
  formRef.value?.clearValidate()
}
</script>

<template>
  <Form ref="formRef" :model="model" :rules="rules">
    <FormItem label="email" prop="email">
      <Input v-model="model.email" />
    </FormItem>
    <FormItem label="password" prop="password">
      <Input type="password" v-model="model.password" />
    </FormItem>
    <FormItem label="confirm password" prop="confirm_password">
      <template #label="{ label }">
        <b>{{ label }}</b>
      </template>
      <Input type="password" v-model="model.confirm_password" />
    </FormItem>
    <div style="display: flex; justify-content: center">
      <Button type="primary" @click="submit">Submit</Button>
      <Button @click="reset">Reset</Button>
    </div>
    <div>
      model:
      <pre>{{ model }}</pre>
    </div>
  </Form>
</template>