• elementui+vue 解决table里包含表单验证


    一、场景一  简单的表单验证示例

    其实问题关键就在于如何给el-form-item动态绑定prop

    :prop="'ratioTableData.'+ scope.$index + '.字段名'"
    
    <el-form :model="tableForm" ref="tableForm">
              <div class="table1-style">
                <list-condition-template ref="table1" :tableData="tableForm.ratioTableData"
                                         :indexColumn="false" :isShowPage="false">
                  <!-- 表格区域 -->
                  <template slot="columns">
                    <el-table-column label="渠道id" prop="id" align="center" v-if="disColumns">
                    </el-table-column>
                    <el-table-column label="渠道名称" prop="channelName" align="center">
                    </el-table-column>
                    <el-table-column label="分发比例(%)" align="center">
                      <template scope="scope">
                        <el-form-item :prop="'ratioTableData.'+ scope.$index + '.ratio'"
                                      :rules="formRules.ratio" style="100%;">
                          <el-input class="custom-input-style" v-model="scope.row.ratio"
                                    placeholder="请输入渠道分发占比,0为不分发库存">
                          </el-input>
                        </el-form-item>
                      </template>
                    </el-table-column>
                  </template>
                </list-condition-template>
              </div>
            </el-form>
    <script>
    import { vailInputRuleFloat } from '@/utils/validator'
    export default {
      name: "allocationSetDialog",
      data() {
        return {
          tableForm: {
            ratioTableData: [],
          },
          formRules: {
            'ratio': [{ validator: vailInputRuleFloat }]
          }
        }
      },
      methods: {}
    }
    </script>
    //utils/validator.js
    
    /** 限制只能输入大于等于0的数字(可以输入2位小数) 不必填*/
    export function vailInputRuleFloat(rule, value, callback) {
        const reg = /((^([1-9]{1}\d*)(\.{0,1}\d{1,2}$|$))|(^(0{1})(?=(\.{1}\d{1,2}$|$))))/
        if (value && !reg.test(value)) {
            callback(new Error('请输入大于等于0的整数或最多两位小数的数字'))
        } else {
            callback()
        }
    }
    

    二、场景二  展开行中使用表单验证----数组里面包含数组

     

    <el-form size="mini" :model="form" ref="form">
            <list-condition-template ref="table" :dataKey="'spuNum'" :tableData="form.dataSource"
                                     :total="total" :isClickRowExpand="true" :isShowPage="false">
              <template slot="columns">
                <el-table-column type="expand">
                  <template slot-scope="scope">
                    <el-row>
                      <el-col :span="3" class="cur-c">
                        <span class="required-style">可分配渠道:</span>
                      </el-col>
                      <el-col :span="21">
                        <channel-allot-module :dataSource="form.dataSource" colCount="2"
                                              :index="scope.$index">
                        </channel-allot-module>
                      </el-col>
                    </el-row>
                  </template>
                </el-table-column>
                <el-table-column label="商品主编码" prop="spuNum" width="180px" show-overflow-tooltip>
                </el-table-column>
                <el-table-column label="商品名称" prop="spuName" min-width="220px" show-overflow-tooltip>
                </el-table-column>
                <el-table-column label="规格型号" prop="spec" width="140px">
                </el-table-column>
                <el-table-column label="可分配数量" prop="stock" width="150px" show-overflow-tooltip>
                </el-table-column>
              </template>
            </list-condition-template>
          </el-form>
    
      data() {
        return {
          form: {
            dataSource: [
                 {
                 stockChannelDistributes:[
                       {
                                       channel: 1,
                                       channelName: “3253252”,
                                       stock: null,
                       },
                      {
                                       channel: 1,
                                       channelName: “3253252”,
                                       stock: null,
                       }
                  ]
                 }
            ]
          },
        }
      },    
    
    // views/commodityStocks/module/channelAllotModule.vue

    <template> <el-row class="channel-allot-s"> <el-col :span="getCol" v-for="(v2,key) in dataSource[index].stockChannelDistributes" :key="key"> <el-form-item :label="v2.channelName" :prop="'dataSource.'+ index +'.stockChannelDistributes.'+ key +'.stock'" label-width="140px" :rules="formRules.stock"> <el-input v-model="v2.stock" placeholder="请输入分配数量" clearable> </el-input> </el-form-item> </el-col> </el-row> </template> <script> import { vailInputRuleInt } from '@/utils/validator' /** * 渠道分配 */ export default { name: "channelAllotModule", props: { /** * 数据源 */ dataSource: { type: Array, default: function () { return [] } }, /** * 列数目 */ colCount: { type: [Number, String], default: 1 }, /** * 下标 */ index: { type: [Number, String], default: 0 } }, data() { return { formRules: { 'stock': [{ validator: vailInputRuleInt, trigger: 'change' }] }, } }, computed: { getCol: function () { let _span = 24; if (this.colCount) { _span = 24 / this.colCount; } return _span; } } } </script> <style lang="scss"> .channel-allot-s { .el-form-item { margin-bottom: 0 !important; height: 50px; } } </style>

      

  • 相关阅读:
    django rest_framework中将json输出字符强制为utf-8编码
    Java
    Java
    Oracle
    IDEA
    Ubuntu
    Ubuntu
    Ubuntu
    Ubuntu
    Oracle
  • 原文地址:https://www.cnblogs.com/1156063074hp/p/16198264.html
Copyright © 2020-2023  润新知