使用element ui 校验表格内嵌套下拉选或输入框填报内容

1. 使用el-form 嵌套 el-table ,利用 el-form 中 rules 校验 

代码:

<el-form class="confirm-table" :model="formData" ref="signerConfirmationTableForm">
            <el-table :data="formData.devOpsProjectUsageDetails" ref="table" border stripe
                :span-method="tableSpanMethod"
                style="width: 100%" :cell-style="{borderColor:'#d9dde2'}"
                :header-cell-style="{backgroundColor:'#e9eef3',color:'#000',borderColor:'#d9dde2'}"
                header-cell-style="width:100%;text-align:center" >
                <!-- <el-table-column type="index" width="50"></el-table-column> -->
                <el-table-column label="局级单位" prop="parentOrgName" min-width="200" show-overflow-tooltip>
                    <template slot="header" slot-scope="scope">
                        <div>
                            <span style="color: red;">*</span>
                            <span>局级单位</span>
                        </div>
                    </template>
                    <template slot-scope="scope">
                        <div>{{scope.row.parentOrgName}}</div>
                    </template>
                </el-table-column>
                <el-table-column label="二级单位" prop="orgName" min-width="200" show-overflow-tooltip>
                    <template slot="header" slot-scope="scope">
                        <div>
                            <span style="color: red;">*</span>
                            <span>二级单位</span>
                        </div>
                    </template>
                    <template slot-scope="scope">
                        <div>{{scope.row.orgName}}</div>
                    </template>
                </el-table-column>
                <!-- 1到12月,对应字段起名叫month1到month12 -->
                <el-table-column :label="formData.headerName">
                    <el-table-column v-for="item in 12" :label="item + '月'" :prop=" `month${item}RegisterCount`"
                        min-width="160">
                        <div style="padding-top: 10px;" slot-scope="scope">
                            <div v-if="scope.row.dataType == 1 || readonly">{{scope.row[`month${item}RegisterCount`]}}</div>
                            <el-form-item v-else
                                    :prop="`devOpsProjectUsageDetails.${scope.$index}.month${item}RegisterCount`"
                                    :rules="rules.monthResourceRules">
                                    <el-input v-model.trim="scope.row[`month${item}RegisterCount`]" placeholder="输正数保留2位小数" style="width:100%"
                                        @blur="handleMonthDataBlur(scope,item,scope.$index)">
                                    </el-input>
                                </el-form-item>
                        </div>
                    </el-table-column>
                </el-table-column>

                <el-table-column label="总计" prop="yearTotalCount" min-width="200" show-overflow-tooltip>
                    <template slot-scope="scope">
                        {{scope.row.yearTotalCount}}
                    </template>
                </el-table-column>
                <el-table-column label="月平均" prop="yearAvgRegisterCount" min-width="200" show-overflow-tooltip>
                    <template slot-scope="scope">
                        {{scope.row.yearAvgRegisterCount}}
                    </template>
                </el-table-column>
                <el-table-column label="附件" prop="fileList" min-width="500">
                    <template slot-scope="scope">
                        <!-- scope.row.dataType 是填报信息 只读 -->
                        <file-upload v-model="scope.row.fileList" :disabled="scope.row.dataType == 1 || readonly" :drag="false"
                            :multiple="true"></file-upload>
                    </template>

                </el-table-column>
                <!-- 填报详情 -->
                <el-table-column label="签认情况">
                    <el-table-column label="签认状态" prop="flowStatusOption.value" min-width="200" show-overflow-tooltip align="center">
                    </el-table-column>
                    <el-table-column label="签认人" prop="signUserName" min-width="200" show-overflow-tooltip align="center">
                    </el-table-column>
                    <el-table-column label="联系方式" prop="applyUserPhone" min-width="200" show-overflow-tooltip align="center">

                    </el-table-column>
                    <el-table-column label="签认时间" prop="signTime" min-width="200" show-overflow-tooltip align="center">

                    </el-table-column>
                </el-table-column>
            </el-table>
        </el-form>
var view = {
        name: 'info-signer-confirmation',
        template: ToolCenter.getTemplate(
            '/infoSignerConfirmation/view.html',
            '/infoSignerConfirmation/view.css'
        ),
        props: {
            visible: {
                // dialog是否展示,用watch监听
                type: Boolean,
                default() {
                    return true;
                }
            },
            // 列表行数据 或 待办通知进来数据
            flowFormData: {
                type: Object,
                default() {
                    return {};
                }
            },

        },
        data: function () {
            // 校验是否和上一行一致
            const checkoutResource = (rule, value, callback) => {
                if (!value && value != 0) {
                    return callback(new Error('输入不能为空'));
                }
                if (isNaN(value)) {
                    return callback(new Error('请输入正数保留两位小数'));
                }
                if (Number(value) < 0) {
                    return callback(new Error('请输入正数保留两位小数'));
                }
                if (rule.field && this.editDataType === 2) {
                    let reg = /(?<=devOpsProjectUsageDetails.).*?(?=.month)/;
                    let index = rule.field.match(reg);
                    if (
                        index &&
                        index.length > 0 &&
                        !isNaN(parseFloat(index[0]))
                    ) {
                        index = index[0];
                        if (index) {
                            // 获取上一行对比
                            let diffFieId = rule.field.replaceAll(
                                'devOpsProjectUsageDetails.' + index + '.',
                                ''
                            );
                            let val =
                                this.formData.devOpsProjectUsageDetails[index - 1][diffFieId];
                            if (value != val) {
                                return callback(new Error(' '));
                            }
                        }
                    }
                }
                callback();
            };
            return {
                readonly: false,
                dialogShow: false,
                // 模板数据
                formData: {
                    headerName: '', // 表头
                    devOpsProjectUsageDetails: [] // 表格数据
                },
                tableData:[],
                formData: {}, // 基本信息表单
                rules: {
                    monthResourceRules: [
                        {
                            validator: checkoutResource,
                            required: true,
                            rowIndex: 0,
                            trigger: 'blur'
                        }
                    ]
                },
                editDataType: 2, // 是否可编辑


            };
        },
        watch: {
        },
        created: function () {},
        mounted: function () {},
        methods: {

            /**
             * 签认校验
             * @param {*} dataArr 遍历数据源
             * @returns true  不一致 false 一致
             */
            checkSignatureData: function(dataArr){
                function areFieldsDifferent(arr, index1, index2, fields) {
                    const obj1 = arr[index1];
                    const obj2 = arr[index2];
                    return fields.some(field => obj1.hasOwnProperty(field) && obj2.hasOwnProperty(field) && obj1[field] !== obj2[field]);
                  }
                  // 匹配月份填报字段
                  let  fieldsToCompare  = []
                  for(let j=1; j<=12; j++){
                    fieldsToCompare.push(`month${j}RegisterCount`)
                  }
                  let flag = areFieldsDifferent(dataArr,0,1, fieldsToCompare)
                  if(flag){
                    DesktopManager.showAlert({
                        type: 'warning',
                        content: `数据有异议,退回修改`
                    });
                    return true
                  }
                  return false
            },
            validateDataForm(ref, msg) {
                return new Promise((resolve, reason) => {
                    ref.validate((valid) => {
                        resolve(valid);
                    });
                });
            },
            // 校验表单
            async submitVerifyForm() {
                let taskValidateArr = [];
                taskValidateArr.push(
                    this.validateDataForm(
                        this.$refs.signerConfirmationTableForm,
                        '请检查表格内容!'
                    )
                );
                let res = await Promise.all(taskValidateArr);
                return res.every((d) => d === true);
            },
            // 提交流程校验
            flowValidFormData: async function (obj, callback) {
                console.log('flowValidFormData ', obj, callback);
                this.flowValidForm.obj = obj
                this.flowValidForm.callback = callback
                /**
                 * 第一个参数 null/控制loading 1关掉loading
                 * 第二个参数 下个流程的参数
                 * callback(1, { userList: [{}] });
                 */
                if(obj.action !== 'returndirect' && obj.action !== 'reject'){
                    // 提交校验
                    let flag = await this.submitVerifyForm();
                    // 对比两条数据,dataType=2 的可编辑数据和前1条 月份填报数据不一致提示出来
                    if(!flag){
                        // 填报数据不一致 走 退回
                        callback(1, { userList: [{}] });
                        DesktopManager.showAlert({
                            type: 'warning',
                            content: `数据有异议,退回修改`
                        });
                        return
                    }
                    //---校验通过流程
                   
                }

            },
        },
        destroyed: function () {}
    };

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于element-ui下拉表格框的问题,可以通过以下步骤来解决。首先,在表格中的el-table-column中添加属性type="selection"来实现多框的显示。其次,为了解决默认值不可删除的问题,可以在el-select中添加属性reserve-selection="true",这样在数据更新之后会保留之前中的数据。最后,通过在toggleSelection方法中调用this.$refs.multipleTable.toggleRowSelection(row)来实现勾和取消勾的功能。如果需要清除所有勾项,可以调用this.$refs.multipleTable.clearSelection()方法。这样就可以解决element-ui下拉表格框的问题了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Element-UI表格框与tags联动](https://blog.csdn.net/weixin_42823060/article/details/120413321)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [解决element-ui里的下拉框 el-select 时,默认值不可删除问题](https://download.csdn.net/download/weixin_38596093/12924091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值