保存
当前位置:   article > 正文

【Element】el-form和el-table嵌套实现表格编辑并提交表单校验_

保存

目录

一、背景

二、功能实现

2.1、el-form和el-table嵌套说明

2.2、具体代码

三、实际项目应用

3.1、增加添加与删除操作

3.2、添加和删除代码

3.3、完整代码

3.4、实际效果

四、需求拓展

4.1、需求描述

4.2、需求分析

4.2.1、描述:

4.2.2、场景:

4.2.3、思路:

4.3、代码实现

4.4、效果展示


一、背景

页面需要用到表格采集用户数据,提交时进行表单校验;即表单中嵌套着表格,保存时进行表单校验

二、功能实现

2.1、el-form和el-table嵌套说明

:model="formData" 给表单绑定数据,formData是表单的数据对象

② 表单数据对象formData中定义的tableData是表单内嵌套的表格显示数据

rules为表单绑定的校验规则

:prop="'tableData.' + scope.$index + '.name'" 绑定传入Form 组件的 model 中对应的字段name

⑤ :rules="rules.name" 绑定表单校验规则

⑥ 整个html结构是一个大表单 el-form里边嵌套的el-table,而el-table中又嵌套了表单项 el-form-item支持编辑。

备注:大多情况下prop会按照惯有思维直接写入字段,而这里是动态绑定的,另外一定要记得每项动态写入rules来进行绑定表单校验 

2.2、具体代码

  1. <template>
  2. <div>
  3. <el-form
  4. :model="formData"
  5. ref="formRef"
  6. :rules="rules"
  7. label-width="108px"
  8. :inline="true"
  9. >
  10. <el-table
  11. :data="formData.tableData"
  12. style="width: 100%" border
  13. >
  14. <el-table-column type="index" width="55" align="center">
  15. </el-table-column>
  16. <el-table-column label="姓名" prop="name" resizable align="center" header-align="center">
  17. <template slot-scope="scope">
  18. <el-form-item :prop="'tableData.' + scope.$index + '.name'" :rules="rules.name">
  19. <el-input type="text" size="small" placeholder="请输入姓名" v-model="scope.row.name"></el-input>
  20. </el-form-item>
  21. </template>
  22. </el-table-column>
  23. <el-table-column label="年龄" prop="age" resizable align="center" header-align="center">
  24. <template slot-scope="scope">
  25. <el-form-item :prop="'tableData.' + scope.$index + '.age'" :rules="rules.age">
  26. <el-input type="text" size="small" placeholder="请输入年龄" v-model="scope.row.age"></el-input>
  27. </el-form-item>
  28. </template>
  29. </el-table-column>
  30. <el-table-column label="性别" prop="sex" resizable align="center" header-align="center">
  31. <template slot-scope="scope">
  32. <el-form-item :prop="'tableData.' + scope.$index + '.sex'" :rules="rules.sex">
  33. <el-input type="text" size="small" placeholder="请输入性别" v-model="scope.row.sex"></el-input>
  34. </el-form-item>
  35. </template>
  36. </el-table-column>
  37. </el-table>
  38. <el-form-item class="footer">
  39. <el-button type="primary" @click="save">保存</el-button>
  40. <el-button>取消</el-button>
  41. </el-form-item>
  42. </el-form>
  43. </div>
  44. </template>
  45. <script>
  46. export default{
  47. data(){
  48. return{
  49. formData:{
  50. tableData:[
  51. {name:'张三',age:18,sex:''},
  52. {name:'李四',age:19,sex:''},
  53. ]
  54. },
  55. rules:{
  56. name:[
  57. { required: true, message: '请输入姓名', trigger: 'blur' },
  58. ],
  59. age:[
  60. { required: true, message: '请输入年龄', trigger: 'blur' },
  61. ],
  62. sex:[
  63. { required: true, message: '请输入性别', trigger: 'blur' },
  64. ],
  65. }
  66. }
  67. },
  68. methods:{
  69. //保存
  70. save(){
  71. this.$refs.formRef.validate((valid) => {
  72. console.log('valid',valid);
  73. if(valid){
  74. //如果valid为true,表示校验通过,可以提交表单,调取接口进行保存
  75. console.log('表单校验通过');
  76. }else {
  77. this.$message.warning("请填写完整的数据");
  78. }
  79. })
  80. },
  81. }
  82. }
  83. </script>
  84. <style lang="scss" scoped>
  85. .footer{
  86. margin-top: 50px;
  87. }
  88. </style>

三、实际项目应用

3.1、增加添加与删除操作

需求:表格增加操作项,具有添加和删除按钮,第一项无法删除,点击添加时,动态增加表格的行数,点击删除的时候,删除表格的行数据。

3.2、添加和删除代码

结构:直接添加一个表格项

  1. <el-table-column label="操作" resizable align="center" header-align="center">
  2. <template slot-scope="{$index}">
  3. <el-button type="primary" icon="el-icon-plus" circle @click="addTable()" v-if="$index == 0"></el-button>
  4. <el-button icon="el-icon-minus" circle @click="delTable($index)" v-if="$index > 0"></el-button>
  5. </template>
  6. </el-table-column>
  1. methods:{
  2. //添加
  3. addTable(){
  4. let newArr = [
  5. {
  6. name:'',
  7. age:'',
  8. sex:''
  9. }
  10. ]
  11. this.formData.tableData.push(...newArr)
  12. },
  13. //删除
  14. delTable(i){
  15. this.formData.tableData.splice(i,1)
  16. }
  17. }

3.3、完整代码

  1. <template>
  2. <div>
  3. <el-form
  4. :model="formData"
  5. ref="formRef"
  6. :rules="rules"
  7. label-width="108px"
  8. :inline="true"
  9. >
  10. <el-table
  11. :data="formData.tableData"
  12. style="width: 100%" border
  13. >
  14. <el-table-column type="index" width="55" align="center">
  15. </el-table-column>
  16. <el-table-column label="姓名" prop="name" resizable align="center" header-align="center">
  17. <template slot-scope="scope">
  18. <el-form-item :prop="'tableData.' + scope.$index + '.name'" :rules="rules.name">
  19. <el-input type="text" size="small" placeholder="请输入姓名" v-model="scope.row.name"></el-input>
  20. </el-form-item>
  21. </template>
  22. </el-table-column>
  23. <el-table-column label="年龄" prop="age" resizable align="center" header-align="center">
  24. <template slot-scope="scope">
  25. <el-form-item :prop="'tableData.' + scope.$index + '.age'" :rules="rules.age">
  26. <el-input type="text" size="small" placeholder="请输入年龄" v-model="scope.row.age"></el-input>
  27. </el-form-item>
  28. </template>
  29. </el-table-column>
  30. <el-table-column label="性别" prop="sex" resizable align="center" header-align="center">
  31. <template slot-scope="scope">
  32. <el-form-item :prop="'tableData.' + scope.$index + '.sex'" :rules="rules.sex">
  33. <el-input type="text" size="small" placeholder="请输入性别" v-model="scope.row.sex"></el-input>
  34. </el-form-item>
  35. </template>
  36. </el-table-column>
  37. <el-table-column label="操作" resizable align="center" header-align="center">
  38. <template slot-scope="{$index}">
  39. <el-button type="primary" icon="el-icon-plus" circle @click="addTable()" v-if="$index == 0"></el-button>
  40. <el-button icon="el-icon-minus" circle @click="delTable($index)" v-if="$index > 0"></el-button>
  41. </template>
  42. </el-table-column>
  43. </el-table>
  44. <el-form-item class="footer">
  45. <el-button type="primary" @click="save">保存</el-button>
  46. <el-button>取消</el-button>
  47. </el-form-item>
  48. </el-form>
  49. </div>
  50. </template>
  51. <script>
  52. export default{
  53. data(){
  54. return{
  55. formData:{
  56. tableData:[
  57. {name:'张三',age:18,sex:'男'},
  58. {name:'李四',age:19,sex:''},
  59. ]
  60. },
  61. rules:{
  62. name:[
  63. { required: true, message: '请输入姓名', trigger: 'blur' },
  64. ],
  65. age:[
  66. { required: true, message: '请输入年龄', trigger: 'blur' },
  67. ],
  68. sex:[
  69. { required: true, message: '请输入性别', trigger: 'blur' },
  70. ],
  71. }
  72. }
  73. },
  74. methods:{
  75. //保存
  76. save(){
  77. this.$refs.formRef.validate((valid) => {
  78. console.log('valid',valid);
  79. if(valid){
  80. //如果valid为true,表示校验通过,可以提交表单,调取接口进行保存
  81. console.log('表单校验通过');
  82. this.$message.success("保存成功");
  83. }else {
  84. this.$message.warning("请填写完整的数据");
  85. }
  86. })
  87. },
  88. //添加
  89. addTable(){
  90. let newArr = [
  91. {
  92. name:'',
  93. age:'',
  94. sex:''
  95. }
  96. ]
  97. this.formData.tableData.push(...newArr)
  98. },
  99. //删除
  100. delTable(i){
  101. this.formData.tableData.splice(i,1)
  102. }
  103. }
  104. }
  105. </script>
  106. <style>
  107. .footer{
  108. margin-top: 50px;
  109. }
  110. </style>

3.4、实际效果

四、需求拓展

4.1、需求描述

背景页面中包含2个功能设置区,当用户进行操作后,统一进行保存,如下

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/201168
推荐阅读
相关标签