Skip to content

Form 表单

不过是些许风霜罢了

基础用法

表单组件的需要各类的表单项支撑,但是目前还在不断完善中,所以暂时先展示一些基础用法,等待后续完善

<script setup lang="ts">
import { ref } from 'vue'

const formData = ref({
  username: '',
  password: '',
  age: '',
  hobbys: ['睡觉']
})

const onSubmit = () => {
  console.log('submit')
}
</script>

<template>
  <c-form ref="form" :model="formData" :label-width="60">
    <c-form-item label="用户名" prop="username">
      <c-input
        v-model="formData.username"
        placeholder="please input username"
      ></c-input>
    </c-form-item>
    <c-form-item label="密码" prop="password">
      <c-input
        v-model="formData.password"
        placeholder="please input possword"
      ></c-input>
    </c-form-item>
    <c-form-item label="年龄" prop="age">
      <c-input v-model="formData.age" placeholder="please input age"></c-input>
    </c-form-item>
    <c-form-item label="爱好" prop="hobbys">
      <c-checkbox-group v-model="formData.hobbys">
        <c-checkbox label="吃饭" value="吃饭"></c-checkbox>
        <c-checkbox label="睡觉" value="睡觉"></c-checkbox>
        <c-checkbox label="打豆豆" value="打豆豆"></c-checkbox>
      </c-checkbox-group>
    </c-form-item>
    <c-form-item>
      <c-button>取消</c-button>
      <c-button type="primary" @click="onSubmit">提交</c-button>
    </c-form-item>
  </c-form>
</template>

<style scoped></style>

对其方式

通过设置 label-position 属性可以改变表单域标签的位置,可选值为 topleft, 当设为 top 时标签会置于表单域的顶部

<script setup lang="ts">
import { ref } from 'vue'

const formData = ref({
  username: '',
  password: '',
  age: '',
  hobbys: ['睡觉']
})

const labelPosition = ref('top')

const handleClick = (pos: string) => {
  labelPosition.value = pos
}
</script>

<template>
  <div class="show-row">
    <c-button-group type="primary">
      <c-button @click="handleClick('left')"> Left </c-button>
      <c-button @click="handleClick('top')"> Top </c-button>
      <c-button @click="handleClick('right')"> Right </c-button>
    </c-button-group>
  </div>

  <c-form
    ref="form"
    :label-position="labelPosition"
    :model="formData"
    :label-width="60"
  >
    <c-form-item label="用户名" prop="username">
      <c-input
        v-model="formData.username"
        placeholder="please input username"
      ></c-input>
    </c-form-item>
    <c-form-item label="密码" prop="password">
      <c-input
        type="password"
        show-password
        v-model="formData.password"
        placeholder="please input possword"
      ></c-input>
    </c-form-item>
    <c-form-item label="年龄" prop="age">
      <c-input v-model="formData.age" placeholder="please input age"></c-input>
    </c-form-item>
    <c-form-item label="爱好" prop="hobbys">
      <c-checkbox-group v-model="formData.hobbys">
        <c-checkbox label="吃饭" value="吃饭"></c-checkbox>
        <c-checkbox label="睡觉" value="睡觉"></c-checkbox>
        <c-checkbox label="打豆豆" value="打豆豆"></c-checkbox>
      </c-checkbox-group>
    </c-form-item>
  </c-form>
</template>

<style scoped></style>

表单校验

Form 组件提供表单验证功能,这也是经常使用的场景,通过给 rules 传入约定的验证规则即可,需要注意的是 form-itemprop 属性的设置,需与规则的 key 保持一致, 更多的用法请参考 async-validator

<script setup lang="ts">
import type { FormInstance, FormDataRules } from 'coderjc-ui'
import { reactive, ref } from 'vue'

interface RuleForm {
  username: string
  password: string
  address: string
  hobbys: string[]
}

const formData = reactive<RuleForm>({
  username: '',
  password: '',
  address: '',
  hobbys: []
})

const ruleFormRef = ref<FormInstance>()

const rules: FormDataRules<typeof formData> = reactive({
  username: [
    { required: true, message: '请输入用户名', trigger: 'blur' },
    { min: 3, max: 10, message: '用户名长度在3到10个字符', trigger: 'change' }
  ],
  password: [
    { required: true, message: '请输入密码', trigger: 'blur' },
    { min: 6, max: 16, message: '密码长度在6到16个字符', trigger: 'change' }
  ],
  address: [{ required: true, message: '请输入你的地址', trigger: 'blur' }],
  hobbys: [
    { type: 'array', required: true, message: '请选择爱好', trigger: 'change' }
  ]
})

const resetForm = () => {
  if (!ruleFormRef.value) return
  ruleFormRef.value.clearValidates()
}

// 校验存在两种用法,根据你的喜好选择合适的即可
//  - 1. async await
const submitForm = async () => {
  if (!ruleFormRef.value) return

  try {
    const result = await ruleFormRef.value.validate()
    console.log('submit success: ', result, formData)
  } catch (error) {
    console.log('submit error', error)
  }
}
//  - 2. callback
// const submitForm = () => {
//   if (!ruleFormRef.value) return

//   ruleFormRef.value.validate((valid, fields) => {
//     if (valid) {
//       console.log('submit success: ', valid)
//     } else {
//       console.log('submit error: ', fields)
//     }
//   })
// }
</script>

<template>
  <c-form ref="ruleFormRef" :model="formData" :rules="rules" :label-width="60">
    <c-form-item label="用户名" prop="username">
      <c-input
        v-model="formData.username"
        placeholder="please input username"
      ></c-input>
    </c-form-item>
    <c-form-item label="密码" prop="password">
      <c-input
        type="password"
        show-password
        v-model="formData.password"
        placeholder="please input possword"
      ></c-input>
    </c-form-item>
    <c-form-item label="地址" prop="address">
      <c-input
        v-model="formData.address"
        placeholder="please input age"
      ></c-input>
    </c-form-item>
    <c-form-item label="爱好" prop="hobbys">
      <c-checkbox-group v-model="formData.hobbys">
        <c-checkbox label="吃饭" value="吃饭"></c-checkbox>
        <c-checkbox label="睡觉" value="睡觉"></c-checkbox>
        <c-checkbox label="打豆豆" value="打豆豆"></c-checkbox>
      </c-checkbox-group>
    </c-form-item>
    <c-form-item>
      <c-button @click="resetForm">重置</c-button>
      <c-button type="primary" @click="submitForm"> 创建 </c-button>
    </c-form-item>
  </c-form>
</template>

<style scoped></style>

尺寸

通过给 Form 组件设置 size 属性,可以改变表单内组件的尺寸,可选值为 largedefaultsmall,当然,你也可以给表单组件单独设置 size 来覆盖 Form 组件设置的 size 属性

NOTE

因为 checkbox 组件编写的时候没有考虑按钮状态样式,所以 checkbox 的 size 变化还在开发中

<script setup lang="ts">
import { SizeType } from 'coderjc-ui'
import { ref } from 'vue'

const formData = ref({
  username: '',
  password: '',
  age: '',
  hobbys: ['睡觉']
})

const size = ref('default')

const handleClick = (val: SizeType) => {
  size.value = val
}
</script>

<template>
  <div class="show-row">
    <c-button-group type="primary">
      <c-button @click="handleClick('large')"> Large </c-button>
      <c-button @click="handleClick('default')"> Default </c-button>
      <c-button @click="handleClick('small')"> Small </c-button>
    </c-button-group>
  </div>

  <c-form ref="form" :size="size" :model="formData" :label-width="60">
    <c-form-item label="用户名" prop="username">
      <c-input
        v-model="formData.username"
        placeholder="please input username"
      ></c-input>
    </c-form-item>
    <c-form-item label="密码" prop="password">
      <c-input
        type="password"
        show-password
        v-model="formData.password"
        placeholder="please input possword"
      ></c-input>
    </c-form-item>
    <c-form-item label="年龄" prop="age">
      <c-input v-model="formData.age" placeholder="please input age"></c-input>
    </c-form-item>
    <c-form-item label="爱好" prop="hobbys">
      <c-checkbox-group v-model="formData.hobbys">
        <c-checkbox label="吃饭" value="吃饭"></c-checkbox>
        <c-checkbox label="睡觉" value="睡觉"></c-checkbox>
        <c-checkbox label="打豆豆" value="打豆豆"></c-checkbox>
      </c-checkbox-group>
    </c-form-item>
    <c-form-item>
      <c-button>重置</c-button>
      <c-button type="primary"> 创建 </c-button>
    </c-form-item>
  </c-form>
</template>

<style scoped></style>

Form API

Form 属性

属性名说明类型默认值
model表单数据对象object--
rules表单验证规则FormItemRule / FormItemRule[]--
label-position表单域标签的位置, 当设置为 leftright 时,一般也需要设置 label-width 属性'left' / 'top' / 'right'left
label-width标签的长度,例如 '50px'string / number--
size用于控制该表单内组件的尺寸'large' / 'default' / 'small' / ''''

Form 插槽

插槽名说明
default自定义默认内容

Form Exposes

名称说明类型
validate对整个表单的内容进行验证。 接收一个回调函数,或返回 PromiseFunction
validateField验证具体的某个字段。Function
resetFields重置该表单项,将其值重置为初始值,并移除校验结果Function
clearValidate清理某个字段的表单验证信息。Function
fields获取所有字段的 contextarray

FormItem API

FormItem 属性

属性名说明类型Default
propmodel 的键名,在你需要校验的时候,该属性是必填的string--
label标签文本string--
required是否为必填项,如不设置,则会根据校验规则确认booleanfalse
rules表单验证规则,teigger 为校验规则的触发方式,更多内容可以参考 async-validatorFormItemRule / FormItemRule[]--
show-message是否显示校验错误信息,一般当你需要自定义错误样式或者保持表单清爽时可以关闭booleantrue
size用于控制该表单域下组件的默认尺寸'large' / 'default' / 'small' / ''''

Form 插槽

插槽名说明类型
default表单的内容--
label标签位置显示的内容object
error验证错误信息的显示内容,你可以使用作用域插槽的方式接收到错误消息object

了解真相才能获得真正的自由