Element-plus表单总结

打印 上一主题 下一主题

主题 1885|帖子 1885|积分 5655

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
表单包含输入框,单选框,下拉选择,多选框等用户输入的组件。输入表单,您可以收集、验证和提交数据。

经典表单

最基础的表单包括各种输入表单项,好比input、select、radio、checkbox等。 在每一个form组件中,需要一个form-item 字段作为输入项的容器,用于获取值与验证值。

  1. <template>
  2.   <el-form :model="form" label-width="auto" style="max-width: 600px">
  3.     <el-form-item label="Activity name">
  4.       <el-input v-model="form.name" />
  5.     </el-form-item>
  6.     <el-form-item label="Activity zone">
  7.       <el-select v-model="form.region" placeholder="please select your zone">
  8.         <el-option label="Zone one" value="shanghai" />
  9.         <el-option label="Zone two" value="beijing" />
  10.       </el-select>
  11.     </el-form-item>
  12.     <el-form-item label="Activity time">
  13.       <el-col :span="11">
  14.         <el-date-picker
  15.           v-model="form.date1"
  16.           type="date"
  17.           placeholder="Pick a date"
  18.           style="width: 100%"
  19.         />
  20.       </el-col>
  21.       <el-col :span="2" class="text-center">
  22.         <span class="text-gray-500">-</span>
  23.       </el-col>
  24.       <el-col :span="11">
  25.         <el-time-picker
  26.           v-model="form.date2"
  27.           placeholder="Pick a time"
  28.           style="width: 100%"
  29.         />
  30.       </el-col>
  31.     </el-form-item>
  32.     <el-form-item label="Instant delivery">
  33.       <el-switch v-model="form.delivery" />
  34.     </el-form-item>
  35.     <el-form-item label="Activity type">
  36.       <el-checkbox-group v-model="form.type">
  37.         <el-checkbox value="Online activities" name="type">
  38.           Online activities
  39.         </el-checkbox>
  40.         <el-checkbox value="Promotion activities" name="type">
  41.           Promotion activities
  42.         </el-checkbox>
  43.         <el-checkbox value="Offline activities" name="type">
  44.           Offline activities
  45.         </el-checkbox>
  46.         <el-checkbox value="Simple brand exposure" name="type">
  47.           Simple brand exposure
  48.         </el-checkbox>
  49.       </el-checkbox-group>
  50.     </el-form-item>
  51.     <el-form-item label="Resources">
  52.       <el-radio-group v-model="form.resource">
  53.         <el-radio value="Sponsor">Sponsor</el-radio>
  54.         <el-radio value="Venue">Venue</el-radio>
  55.       </el-radio-group>
  56.     </el-form-item>
  57.     <el-form-item label="Activity form">
  58.       <el-input v-model="form.desc" type="textarea" />
  59.     </el-form-item>
  60.     <el-form-item>
  61.       <el-button type="primary" @click="onSubmit">Create</el-button>
  62.       <el-button>Cancel</el-button>
  63.     </el-form-item>
  64.   </el-form>
  65. </template>
  66. <script lang="ts" setup>
  67. import { reactive } from 'vue'
  68. // do not use same name with ref
  69. const form = reactive({
  70.   name: '',
  71.   region: '',
  72.   date1: '',
  73.   date2: '',
  74.   delivery: false,
  75.   type: [],
  76.   resource: '',
  77.   desc: '',
  78. })
  79. const onSubmit = () => {
  80.   console.log('submit!')
  81. }
  82. </script>
复制代码
  提示
  W3C标准定义:
  当一个表单中只有一个单行文本输出字段时,浏览器应当将在此字段中按下Enter(回车键)的行为视为提交表单的请求。如果希望阻止这一默认行为,可以在<el-form>标签上添加@submit.prevent。
  
行内表单 

当垂直方向空间受限且表单较简朴时,可以在一行内放置表单。通过设置 inline 属性为 true 可以让表单域变为行内的表单域。



对齐方式

根据设计情况,来选择最佳的标签对齐方式。您可以分别设置el-form-item 的 label-position. 如果值为空,则会使用el-form 的 label-position。通过设置 label-position 属性可以改变表单域标签的位置,可选值为 top、left,当设为 top 时标签会置于表单域的顶部。

可以绑定在 <el-form>标签上。

也可以单独绑定在<el-form-item>标签上。 

  1. const labelPosition = ref('top')
  2. const itemLabelPosition = ref('')
复制代码

 表单校验

Form组件答应您验证用户的输入是否符合规范,来帮助你找到和纠正错误。
Form 组件提供了表单验证的功能,只需为 rules 属性传入约定的验证规则,并将 form-Item 的 prop 属性设置为需要验证的特殊键值即可。 

ref用来定义这个<el-form>表单,:rules用来绑定所需要的规则,具体可见js代码。

prop属性用于rules中对应数据规则的匹配,注意:prop中的值需要和v-model中的值对应,例如prop=”name",v-model为="ruleForm.name",否则会出现输入值提示没有输入值的征象。

这是表单规则对应的js代码。可根据自身需求进行修改。
  1. const ruleFormRef = ref()
  2. const rules = reactive({
  3.   name: [
  4.     { required: true, message: 'Please input Activity name', trigger: 'blur' },
  5.     { min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' },
  6.   ],
  7.   region: [
  8.     {
  9.       required: true,
  10.       message: 'Please select Activity zone',
  11.       trigger: 'change',
  12.     },
  13.   ],
  14.   count: [
  15.     {
  16.       required: true,
  17.       message: 'Please select Activity count',
  18.       trigger: 'change',
  19.     },
  20.   ],
  21. })
  22. const submitForm = async (formEl) => {
  23.   if (!formEl) return
  24.   await formEl.validate((valid, fields) => {
  25.     if (valid) {
  26.       console.log('submit!')
  27.     } else {
  28.       console.log('error submit!', fields)
  29.     }
  30.   })
  31. }
复制代码

自定义校验规则

这个例子中展示了如何使用自定义规则来完成密码的二次验证。本例还使用 status-icon 属性为输入框添加了表示校验效果的反馈图标。

 自定义校验规则同样需要写ref,:rules绑定,以及prop属性。

在js代码中,rules里用了validator,背面的参数为自定义校验的方法。 注意自定义的验证回调函数必须被调用即要写callback()。
  1. const ruleFormRef = ref()
  2. const rules = reactive({
  3.   pass: [{ validator: validatePass, trigger: 'blur' }],
  4.   checkPass: [{ validator: validatePass2, trigger: 'blur' }],
  5.   age: [{ validator: checkAge, trigger: 'blur' }],
  6. })
  7. const checkAge = (rule, value, callback) => {
  8.   if (!value) {
  9.     return callback(new Error('Please input the age'))
  10.   }
  11.   setTimeout(() => {
  12.     if (!Number.isInteger(value)) {
  13.       callback(new Error('Please input digits'))
  14.     } else {
  15.       if (value < 18) {
  16.         callback(new Error('Age must be greater than 18'))
  17.       } else {
  18.         callback()
  19.       }
  20.     }
  21.   }, 1000)
  22. }
  23. const validatePass = (rule, value, callback) => {
  24.   if (value === '') {
  25.     callback(new Error('Please input the password'))
  26.   } else {
  27.     if (ruleForm.checkPass !== '') {
  28.       if (!ruleFormRef.value) return
  29.       ruleFormRef.value.validateField('checkPass')
  30.     }
  31.     callback()
  32.   }
  33. }
  34. const validatePass2 = (rule, value, callback) => {
  35.   if (value === '') {
  36.     callback(new Error('Please input the password again'))
  37.   } else if (value !== ruleForm.pass) {
  38.     callback(new Error("Two inputs don't match!"))
  39.   } else {
  40.     callback()
  41.   }
  42. }
复制代码
 
添加/删除表单项

除了一次通过表单组件上的所有验证规则外,您也可以动态地通过验证规则或删除单个表单字段的规则。

 这里主要是通过New domain来创建新的表单,并为其添加验证规则,跟之前的表单验证一样,只不过这侧我们把 :rules写在了<el-form-item>里。

这里使用了循环,为每个通过按钮生成的表单添加了对应的label 和 prop对应规则。 

这个为添加新的表单和移除新的表单的js方法。 
  1. const addDomain = () => {
  2.   dynamicValidateForm.domains.push({
  3.     key: Date.now(),
  4.     value: '',
  5.   })
  6. }
  7. const removeDomain = (item) => {
  8.   const index = dynamicValidateForm.domains.indexOf(item)
  9.   if (index !== -1) {
  10.     dynamicValidateForm.domains.splice(index, 1)
  11.   }
  12. }
复制代码

数字范例验证

数字范例的验证需要在 v-model处加上 .number 的修饰符,这是Vue自身提供的用于将绑定值转化为number范例的修饰符。

 

 
尺寸控制

表单中所有子组件都继续了该表单的 size 属性。 同样,form-item 也有一个 size 属性。 如果希望某个表单项或某个表单组件的尺寸差别于Form上的 size 属性,直接为这个表单项或表单组件设置自己的size属性即可。

 

  1. const size = ref('default')
复制代码
 
无停滞

当在 el-form-item 内只有一个输入框(或相关的控制部件,如选择或复选框),表单项的标签将自动附加在谁人输入框上。如果 el-form-item 内有多个input,则表单会被设置成 WAI-ARIA 组的role。 在这种情况下,需要手动给每个 input 指定访问标签。

 


  1. const formAccessibility = reactive({
  2.   fullName: '',
  3.   firstName: '',
  4.   lastName: '',
  5. })
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表