0


element-ui的el-form表单和el-table校验嵌套使用校验el-input和el-select

场景:前端开发中,经常会遇到比较多的表单填写页面,其中有el-form,el-table,表格的每一列中又嵌套着输入框或者下拉框,然后每个还需要做单独的校验

效果:

点击保存可校验el-input和el-select是否有值,不符合校验规则就标红提醒

1.el-form嵌套el-table

  • 1.el-form里面嵌套el-table <el-form :model="formData" :rules="formData.rules" ref="formRef"> <el-table :data="formData.tableData" style="width: 100%"> <el-table-column prop="id" label="单号" width="100"> </el-table-column> </el-table></el-form>

  • 2.在el-table-column自定义内容里面,嵌套el-form-item,里面再放el-input或者el-select结构 <el-table-column prop="name" label="商品名" width="180"> <template slot-scope="scope"> <el-form-item> <el-input v-model="scope.row.name"></el-input> </el-form-item> </template> </el-table-column>

  • 3.数据的结构 因为el-form是最外层的,所以formData是个对象,对象里放el-table用到的数组和rules 这样定义是为了校验时用到rules

  1. formData: {
  2. rules: {
  3. name: {
  4. required: true,
  5. message: '请输入商品名',
  6. tirgger: ['blur', 'change']
  7. },
  8. selected: {
  9. required: true,
  10. message: '请选择',
  11. tirgger: 'change'
  12. }
  13. },
  14. tableData: [
  15. {id: '001'},
  16. {id: '002'},
  17. {id: '003'},
  18. ]
  19. },

2.定义规则

1.el-form绑定: rules使用formData.rules整个对象,同时定义一个ref

  1. <el-form :model="formData" :rules="formData.rules" ref="formRef">
    1. 保证prop必须唯一

自定义prop:使用 列表数据属性名+列的下标scope.$index+列的数据属性名

  1. <el-table-column
  2. prop="name"
  3. label="商品名"
  4. width="180">
  5. <template slot-scope="scope">
  6. <el-form-item :prop="'tableData.' + scope.$index + '.name'" :rules="formData.rules.name">
  7. <el-input v-model="scope.row.name"></el-input>
  8. </el-form-item>
  9. </template>
  10. </el-table-column>

注意:如果不是使用列表数据属性名tableData,会出现报错
Error: please transfer a valid prop path to form item

    1. 保证每一个el-form-item都要配置rules属性

rules使用formData.rules对应的属性的规则

3.完整代码

  1. <template>
  2. <div>
  3. <el-form :model="formData" :rules="formData.rules" ref="formRef">
  4. <el-table
  5. :data="formData.tableData"
  6. style="width: 100%">
  7. <el-table-column
  8. prop="id"
  9. label="单号"
  10. width="100">
  11. </el-table-column>
  12. <el-table-column
  13. prop="name"
  14. label="商品名"
  15. width="180">
  16. <template slot-scope="scope">
  17. <el-form-item :prop="'tableData.' + scope.$index + '.name'" :rules="formData.rules.name">
  18. <el-input v-model="scope.row.name"></el-input>
  19. </el-form-item>
  20. </template>
  21. </el-table-column>
  22. <el-table-column
  23. prop="class"
  24. label="分类">
  25. <template slot-scope="scope">
  26. <el-form-item :prop="'tableData.' +scope.$index + '.class'" :rules="formData.rules.selected">
  27. <el-select v-model="scope.row.class">
  28. <el-option
  29. v-for="item in classOption"
  30. :key="item.value"
  31. :label="item.label"
  32. :value="item.value"
  33. ></el-option>
  34. </el-select>
  35. </el-form-item>
  36. </template>
  37. </el-table-column>
  38. </el-table>
  39. </el-form>
  40. <el-button @click="submitForm('formRef')">提交</el-button>
  41. </div>
  42. </template>
  43. <script>
  44. export default {
  45. data() {
  46. return {
  47. formData: {
  48. rules: {
  49. name: {
  50. required: true,
  51. message: '请输入商品名',
  52. tirgger: ['blur', 'change']
  53. },
  54. selected: {
  55. required: true,
  56. message: '请选择',
  57. tirgger: 'change'
  58. }
  59. },
  60. tableData: [
  61. {id: '001'},
  62. {id: '002'},
  63. {id: '003'},
  64. ]
  65. },
  66. classOption: [
  67. {
  68. value: 0,
  69. label: '分类1'
  70. },
  71. {
  72. value: 0,
  73. label: '分类1'
  74. }
  75. ]
  76. }
  77. },
  78. methods: {
  79. submitForm(formName) {
  80. this.$refs[formName].validate((valid) => {
  81. if (valid) {
  82. alert('submit!');
  83. } else {
  84. console.log('error submit!!');
  85. return false;
  86. }
  87. });
  88. },
  89. }
  90. }
  91. </script>

本文转载自: https://blog.csdn.net/m0_66722601/article/details/128254991
版权归原作者 cyndi_超努力 所有, 如有侵权,请联系我们删除。

“element-ui的el-form表单和el-table校验嵌套使用校验el-input和el-select”的评论:

还没有评论