vue2实现在el-table里修改数据,插入输入框,并且根据输入数据,影响该行其他关联数据

复制代码
   <div class="content-all">
            <div class="content-tit">填写内容</div>
            <div class="content-text">
              <el-radio v-model="radio" label="1">计划负荷</el-radio>
              <el-radio v-model="radio" label="2">申报量</el-radio>
              <el-button type="primary" @click="modification()"
                >批量修改</el-button
              >
              <el-table
                :data="tableDataFill"
                height="290"
                style="width: 99%; margin-top: 20px"
              >
                <el-table-column
                  prop="runDate"
                  label="响应日"
                  width="110"
                ></el-table-column>
                <el-table-column
                  prop="period"
                  label="响应时段"
                ></el-table-column>
                <el-table-column prop="tag" label="需求类型">
                  <template slot-scope="scope">
                    <el-tag
                      :type="
                        scope.row.demandFlag === '1' ? 'primary' : 'success'
                      "
                      disable-transitions
                    >
                      {{ scope.row.demandFlag === "1" ? "削峰" : "填谷" }}
                    </el-tag>
                  </template>
                </el-table-column>
                <el-table-column
                  prop="baseLine"
                  label="基线负荷(MW)"
                ></el-table-column>
                <el-table-column
                  v-if="radio === '2'"
                  prop="planeLine"
                  label="计划负荷(MW)"
                ></el-table-column>

                <el-table-column label="计划负荷(MW)" v-if="radio === '1'">
                  <template slot-scope="scope">
                    <el-input
                      v-model="scope.row.planeLine"
                      placeholder="输入计划负荷"
                      type="number"
                      @input="updateDemandResp(scope.row)"
                      oninput="if(value<0)value=0"
                    ></el-input>
                  </template>
                </el-table-column>

                <el-table-column
                  prop="typicalLine"
                  label="典型负荷(MW)"
                ></el-table-column>
                <el-table-column
                  prop="tradeCount"
                  label="历史交易量(MW)"
                ></el-table-column>

                <el-table-column
                  prop="demandResp"
                  label="申报量(MW)"
                  v-if="radio === '1'"
                ></el-table-column>
                <el-table-column
                  v-if="radio === '2'"
                  prop="demandResp"
                  label="申报量(MW)"
                >
                  <template slot-scope="scope">
                    <el-input
                      v-model="scope.row.demandResp"
                      placeholder="输入申报量"
                      @input="updatePlaneLine(scope.row)"
                    ></el-input>
                  </template>
                </el-table-column>
              </el-table>
            </div>
          </div>

js块

复制代码
 methods: {
    updateDemandResp(row) {
      const baseLine = +row.baseLine || 0;
      const tradeCount = +row.tradeCount || 0;
      const plannedLoad = +row.planeLine || 0;

      //  申报量
      row.demandResp = plannedLoad - baseLine - tradeCount;
      console.log("111", row.demandResp);
      if (row.demandFlag === "1" && row.demandResp > 0) {
        row.demandResp = 0;
      } else if (row.demandFlag === "1" && row.demandResp < 0) {
        row.demandResp = row.demandResp.toFixed(2);
      } else if (row.demandFlag === "-1" && row.demandResp > 0) {
        row.demandResp = +row.demandResp.toFixed(2);
      } else if (row.demandFlag === "-1" && row.demandResp < 0) {
        row.demandResp = 0;
      }
      this.updateTableDataFill(row);
    },
    updatePlaneLine(row) {
      const baseLine = +row.baseLine || 0;
      const tradeCount = +row.tradeCount || 0;
      const declaredAmount = +row.demandResp || 0;

      //  计划负荷
      row.planeLine = baseLine + tradeCount + declaredAmount;
      if (row.planeLine < 0) {
        row.planeLine = 0;
      }

      this.updateTableDataFill(row);
    },
    updateTableDataFill(row) {
      const index = this.tableDataFill.findIndex(
        (item) => item.runDate === row.runDate && item.period === row.period
      );
      if (index !== -1) {
        this.$set(this.tableDataFill, index, {
          ...this.tableDataFill[index],
          ...row,
        });
      }
    },

比如,实现申报量 根据填写的计划负荷计算,数值=计划负荷-基线负荷-历史交易量,并且校验填谷申报量≥0,削峰申报量≤0,计划负荷根据填写的申报量计算,数值=基线负荷+历史交易量+申报量,并且校验计划负荷≥0

输入为来自输入字段的字符串保留。

无论何时进行计算,都会使用parseFloat()对值进行转换。这有效地处理任何非数字输入,确保只对有效数字进行计算。无效输入将默认为0。

处理非数字字符串:

parseFloat()函数的作用是将字符串转换为浮点数。如果解析失败(例如,输入为空或不是数字),我们将通过返回到0来优雅地处理它。

动态更新:

updateDemandResp()和updatePlaneLine()中的逻辑保持不变,确保在用户输入后立即进行重新计算。

空字符串初始化:

tableDataFill属性planeLine和demandasp被初始化为空字符串,允许用户输入初始处理为字符串的值。

相关推荐
啃火龙果的兔子2 小时前
判断手机屏幕上的横向滑动(左滑和右滑)
javascript·react.js·智能手机
yuanmenglxb20044 小时前
react基础技术栈
前端·javascript·react.js
coding随想4 小时前
从SPDY到HTTP/2:网络协议的革新与未来
javascript
一枚码农4045 小时前
使用pnpm、vite搭建Phaserjs的开发环境
javascript·游戏·vite·phaserjs
hdsoft_huge5 小时前
VUE npm ERR! code ERESOLVE, npm ERR! ERESOLVE could not resolve, 错误有效解决
vue.js·rust·npm
agenIT6 小时前
vue3 getcurrentinstance 用法
javascript·vue.js·ecmascript
代码老y6 小时前
基于springboot的校园商铺管理系统的设计与实现
java·vue.js·spring boot·后端·毕业设计·课程设计·个人开发
码农捻旧6 小时前
JavaScript 性能优化按层次逐步分析
开发语言·前端·javascript·性能优化
小辉懂编程6 小时前
2025年最新基于Vue基础项目Todolist任务编辑器【适合新手入手】【有这一片足够了】【附源码】
前端·vue.js·编辑器
我是哈哈hh6 小时前
【Vue3】生命周期 & hook函数 & toRef
开发语言·前端·javascript·vue.js·前端框架·生命周期·proxy模式