经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
v-for中动态校验el-form表单项的实践
来源:jb51  时间:2022/5/30 9:34:08  对本文有异议

问题描述

在项目开发中,我们经常会遇到表单保存的功能,在表单保存前,常常需要做表单必填项的校验,校验通过以后才去发请求保存表单数据。

但是,这个表单如果是动态的,即:可以新增相同的表单。比如这个表单有输入框和下拉框需要校验,点击添加表格按钮,再新增一个相同的表单,同样新的这个表单对应的输入框和下拉框也需要校验。

本文记录一下对应代码写法思路,我们先看一下效果图:

效果图

代码思路

  • 表单的主数据是要写成对象形式 :model="ruleForm" 不过既然是要动态的,肯定是要循环呢,所以,可以写成这样:
  1. ruleForm: {
  2. // 动态循环项数组
  3. formItemArr: [
  4. {
  5. name: "",
  6. gender: "",
  7. },
  8. ],
  9. },
  • 点击添加表格的时候,就可以直接push对应项就行啦,即,这样:
  1. // 添加一个表格
  2. addForm() {
  3. let itemObj = {
  4. name: "",
  5. gender: "",
  6. };
  7. this.ruleForm.formItemArr.push(itemObj);
  8. },
  • 重点来喽,因为是循环的,所以prop也要变成动态的了,要拼接上index,就变成根据索引去找对应的校验项了,即为::prop="'formItemArr.' + index + '.name'" ,这样的话,就变成了:prop="formItemArr.0.name"prop="formItemArr.1.name"prop="formItemArr.2.name" ... 这样的话,就可以照顾到每一项中的每一个绑定的值了,校验就不会漏掉

  • 校验规则写成内联就可以触发校验函数this.$refs["ruleForm"].validate((val) => {})

  1. <el-form-item
  2. label="姓名"
  3. :prop="'formItemArr.' + index + '.name'"
  4. :rules="{
  5. required: true,
  6. message: '请填写',
  7. trigger: 'blur',
  8. }"
  9. >
  10. ......

完整代码

演示的话,大家直接复制粘贴即可

  1. <template>
  2. <div class="box">
  3. <el-button @click="addForm" size="mini" type="primary" plain
  4. >添加表格</el-button
  5. >
  6. <el-button @click="saveForm" size="mini" type="primary" plain
  7. >保存表格</el-button
  8. >
  9. <br />
  10. <br />
  11. <el-form
  12. :model="ruleForm"
  13. ref="ruleForm"
  14. label-width="100px"
  15. class="formform"
  16. >
  17. <div
  18. class="formformItemClass"
  19. v-for="(item, index) in ruleForm.formItemArr"
  20. :key="index"
  21. >
  22. <el-form-item
  23. label="姓名"
  24. :prop="'formItemArr.' + index + '.name'"
  25. :rules="{
  26. required: true,
  27. message: '请填写',
  28. trigger: 'blur',
  29. }"
  30. >
  31. <el-input
  32. size="mini"
  33. v-model.trim="item.name"
  34. placeholder="请填写"
  35. style="width: 200px"
  36. ></el-input>
  37. </el-form-item>
  38. <el-form-item
  39. label="性别"
  40. :prop="'formItemArr.' + index + '.gender'"
  41. :rules="{
  42. required: true,
  43. message: '请选择',
  44. trigger: 'change',
  45. }"
  46. >
  47. <el-select
  48. clearable
  49. size="mini"
  50. v-model="item.gender"
  51. placeholder="请选择"
  52. >
  53. <el-option label="男" value="男"></el-option>
  54. <el-option label="女" value="女"></el-option>
  55. </el-select>
  56. </el-form-item>
  57. </div>
  58. </el-form>
  59. </div>
  60. </template>
  61.  
  62. <script>
  63. export default {
  64. data() {
  65. return {
  66. ruleForm: {
  67. // 动态循环项数组
  68. formItemArr: [
  69. {
  70. name: "",
  71. gender: "",
  72. },
  73. ],
  74. },
  75. };
  76. },
  77. methods: {
  78. // 添加一个表格
  79. addForm() {
  80. let itemObj = {
  81. name: "",
  82. gender: "",
  83. };
  84. this.ruleForm.formItemArr.push(itemObj);
  85. },
  86. // 保存表格
  87. saveForm() {
  88. this.$refs["ruleForm"].validate((val) => {
  89. if (val) {
  90. console.log("符合要求,保存成功", this.ruleForm);
  91. } else {
  92. console.log("error submit!!");
  93. return false;
  94. }
  95. });
  96. },
  97. },
  98. };
  99. </script>
  100.  
  101. <style lang="less" scoped>
  102. .box {
  103. width: 100%;
  104. height: 100%;
  105. box-sizing: border-box;
  106. padding: 24px;
  107. .formform {
  108. width: 360px;
  109. .formformItemClass {
  110. padding-top: 24px;
  111. border: 2px dashed #ccc;
  112. margin-bottom: 18px;
  113. }
  114. }
  115. }
  116. </style>

到此这篇关于v-for中动态校验el-form表单项的实践的文章就介绍到这了,更多相关v-for el-form表单项内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号