当前位置:   article > 正文

vue3在table里使用elementUI的form表单验证_vue3校验el-table里面的form

vue3校验el-table里面的form

        常规情况下。rules和formItem是一对一的。例如下面的情况,判断表单内的测试1和测试2是否为空。

  1. <template>
  2. <el-form
  3. :model="formParams.form"
  4. :rules="formParams.rules"
  5. >
  6. <el-form-item label="测试1" prop="input1">
  7. <el-input v-model="formParams.form.input1"></el-input>
  8. </el-form-item>
  9. <el-form-item label="测试2" prop="input2">
  10. <el-input v-model="formParams.form.input2"></el-input>
  11. </el-form-item>
  12. </el-form>
  13. </template>
  14. <script lang="ts" setup>
  15. import {reactive} from "vue";
  16. const formParams = reactive({
  17. form:{
  18. input1: "",
  19. input2: ""
  20. },
  21. rules: {
  22. input1: {
  23. validator: validator_isEmpty,
  24. trigger: 'change'
  25. },
  26. input2: {
  27. validator: validator_isEmpty,
  28. trigger: 'change'
  29. }
  30. }
  31. })
  32. function validator_isEmpty (rule: any, value: string, callback: any) {
  33. if (isEmpty(value)) {
  34. callback(new Error("必填项,请输入数据"));
  35. } else {
  36. callback();
  37. }
  38. }
  39. const isEmpty = function (value: any) {
  40. if (
  41. value === null ||
  42. value === undefined ||
  43. value === "" ||
  44. value.toString().trim() === "" ||
  45. value.length === 0 ||
  46. Object.keys(value.toString()).length === 0 ||
  47. JSON.stringify(value) === "[{}]"
  48. ) {
  49. return true;
  50. } else {
  51. return false;
  52. }
  53. }
  54. </script>
  55. <style scoped lang="scss">
  56. </style>

        但是,如果在table中就按照常规的写法如下会发现不管如何输入或删除都将触发valid=false校验。如果在validator_isEmpty中打印value值会发现,value一直未undefined。

  1. <template>
  2. <el-form
  3. :model="tableData.data"
  4. :rules="tableData.rules"
  5. >
  6. <el-table
  7. :data="tableData.data">
  8. <el-table-column label="测试1">
  9. <template #default="scope">
  10. <el-form-item prop="input1">
  11. <el-input v-model="scope.row.input1"></el-input>
  12. </el-form-item>
  13. </template>
  14. </el-table-column>
  15. <el-table-column label="测试2">
  16. <template #default="scope">
  17. <el-form-item prop="input2">
  18. <el-input v-model="scope.row.input2"></el-input>
  19. </el-form-item>
  20. </template>
  21. </el-table-column>
  22. </el-table>
  23. </el-form>
  24. </template>
  25. <script lang="ts" setup>
  26. import {reactive} from "vue";
  27. let tableData = reactive({
  28. data:[
  29. {
  30. input1: "",
  31. input2: ""
  32. }
  33. ],
  34. rules: {
  35. input1: {
  36. validator: validator_isEmpty,
  37. trigger: 'change'
  38. },
  39. input2: {
  40. validator: validator_isEmpty,
  41. trigger: 'change'
  42. }
  43. }
  44. })
  45. const formParams = reactive({
  46. form: {
  47. input1: "",
  48. input2: ""
  49. },
  50. rules: {
  51. input1: {
  52. validator: validator_isEmpty,
  53. trigger: 'change'
  54. },
  55. input2: {
  56. validator: validator_isEmpty,
  57. trigger: 'change'
  58. }
  59. }
  60. })
  61. function validator_isEmpty(rule: any, value: string, callback: any) {
  62. if (isEmpty(value)) {
  63. callback(new Error("必填项,请输入数据"));
  64. } else {
  65. callback();
  66. }
  67. }
  68. const isEmpty = function (value: any) {
  69. if (
  70. value === null ||
  71. value === undefined ||
  72. value === "" ||
  73. value.toString().trim() === "" ||
  74. value.length === 0 ||
  75. Object.keys(value.toString()).length === 0 ||
  76. JSON.stringify(value) === "[{}]"
  77. ) {
  78. return true;
  79. } else {
  80. return false;
  81. }
  82. }
  83. </script>
  84. <style scoped lang="scss">
  85. </style>

        所以使用下面的方式。但是有几个重点。

1、外层的el-form的model需要关联到tableData.data,否则使用validate方法将无法触发

2、去掉外层el-form的rules属性

3、对el-table-column里的el-form-item添加rules属性,其中rules中的validator采用bind的方式传递行参数

4、对el-table-column里的el-form-item中prop属性需要保留

之后的操作就跟普通的form验证一样

  1. <template>
  2. <el-form
  3. :model="tableData.data"
  4. >
  5. <el-table
  6. :data="tableData.data">
  7. <el-table-column label="测试1">
  8. <template #default="scope">
  9. <el-form-item prop="input1" :rules="{
  10. validator: validator_isEmpty_arg.bind(this, scope.row.input1),
  11. trigger: 'change'
  12. }">
  13. <el-input v-model="scope.row.input1"></el-input>
  14. </el-form-item>
  15. </template>
  16. </el-table-column>
  17. <el-table-column label="测试2">
  18. <template #default="scope">
  19. <el-form-item prop="input2" :rules="{
  20. validator: validator_isEmpty_arg.bind(this, scope.row.input2),
  21. trigger: 'change'
  22. }">
  23. <el-input v-model="scope.row.input2"></el-input>
  24. </el-form-item>
  25. </template>
  26. </el-table-column>
  27. </el-table>
  28. </el-form>
  29. </template>
  30. <script lang="ts" setup>
  31. import {reactive} from "vue";
  32. let tableData = reactive({
  33. data: [
  34. {
  35. input1: "",
  36. input2: ""
  37. }
  38. ]
  39. })
  40. function validator_isEmpty_arg(rowValue: any, rule: any,value: string, callback: any){
  41. if (isEmpty(rowValue)) {
  42. callback(new Error("必填项,请输入数据"));
  43. } else {
  44. callback();
  45. }
  46. }
  47. const isEmpty = function (value: any) {
  48. if (
  49. value === null ||
  50. value === undefined ||
  51. value === "" ||
  52. value.toString().trim() === "" ||
  53. value.length === 0 ||
  54. Object.keys(value.toString()).length === 0 ||
  55. JSON.stringify(value) === "[{}]"
  56. ) {
  57. return true;
  58. } else {
  59. return false;
  60. }
  61. }
  62. </script>
  63. <style scoped lang="scss">
  64. </style>

 

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

闽ICP备14008679号