vxe编辑保存表格

news2025/1/19 20:37:03

业务需求:

        1、需要点击编辑时,全部表格显示编辑框,点击保存,全部保存。

        2、因为位置问题,产品经理把24小时分成了两行,开发就得分两个表格。列标题是写死的,文字偏移也是写死的,其他数据后台返回,两个表用了一个数据源。

columns使用了循环, edit-config 设置了 autoClear 属性为 false,在用户输入时,编辑器不会自动清除文本框中的内容。使用了默认插槽,v-if else显示输入框

 

        <div class="tableInfo">
          <div class="header">
            <div class="title">
              xxxx
            </div>
            <div class="rightBtn">
              <el-button type="primary" @click="editTableTempUp()" v-if="edit">编辑</el-button>
              <el-button type="primary" @click="clearEditTempUp()" v-if="!edit">保存</el-button>
            </div>
          </div>

          <vxe-table ref="tableRefTempUp1" :data="tableDataTempUp" border height="100px" :column-config="{
            resizable: true
          }" :row-config="{ useKey: true }" stripe :menu-config="menuConfig" :edit-config="{ autoClear: false }"
            @menu-click="contextMenuClickEvent">

            <vxe-column v-for="(item, index) in columnDataHour1" :key="item.value" :field="item.value" show-overflow
              :edit-render="index === 0 ? null : { autofocus: '.vxe-input--inner' }" :title="item.name"
              :align="index === 0 ? 'center' : 'right'" :width="index === 0 ? 60 : 68"
              :fixed="index === 0 ? 'left' : (index === columnDataHour1.length - 1) ? 'right' : undefined">

              <template #default="{ row }">
                <span v-if="edit">{{ row[item.value] }}</span>
                <vxe-input v-else-if="item.name !== '时间'" v-model="row[item.value]" type="float" placeholder="0.00"
                  :digits="2" :min="-10" :max="10"></vxe-input>
                <span v-else>{{ row[item.value] }}</span>
              </template>
            </vxe-column>
          </vxe-table>

          <vxe-table ref="tableRefTempUp2" :data="tableDataTempUp" border height="100px" :column-config="{
            resizable: true
          }" :row-config="{ useKey: true }" stripe :auto-resize="true" :menu-config="menuConfig"
            :edit-config="{ autoClear: false }" @menu-click="contextMenuClickEvent">
            <vxe-column v-for="(item, index) in columnDataHour2" :key="item.value" :field="item.value" show-overflow
              :edit-render="index === 0 ? null : { autofocus: '.vxe-input--inner' }" :title="item.name"
              :align="index === 0 ? 'center' : 'right'" :width="index === 0 ? 60 : 68"
              :fixed="index === 0 ? 'left' : (index === columnDataHour2.length - 1) ? 'right' : undefined">
              <template #default="{ row }">
                <span v-if="edit">{{ row[item.value] }}</span>
                <vxe-input v-else-if="item.name !== '时间'" v-model="row[item.value]" type="float" placeholder="0.00"
                  :digits="2" :min="-10" :max="10"></vxe-input>
                <span v-else>{{ row[item.value] }}</span>
              </template>
            </vxe-column>
          </vxe-table>
        </div>
<script lang='ts'>
import { reactive, toRefs, computed, watch, onMounted, onUnmounted } from 'vue'
import { getConTimeoffsetData, setConTimeoffsetData, getConTempTrend } from '@/api/RunMonitor/StationMonitor/controlStrategy';
import { ElMessage, ElMessageBox } from 'element-plus'
import moment from 'moment';
import { cloneDeep, sortBy, mean } from 'lodash-es'
import { Echart } from '@/components/Echart'
import { set } from 'lodash-es'
import { scatterChartOption, scatterChartOptionAvg } from './chartOptions.js'

export default {
  components: {
    Echart,
    PatrolDialog,
  },
  emits: ['onClose'],
  setup(props, { emit }) {


    const state = reactive({
      // ref
      echartsTempUp: null,
      tableRefTempUp1: null,
      tableRefTempUp2: null,


      chartLeftData: scatterChartOption,

      supTempLine: [],
      supTempPoint: [],
      avgTempLine: [],
      avgTempPoint: [],
      // data
      show: false,
      edit: true,
      edit2: true,
      rowInfo: {}, // 点击的行数据
      tableDataTempUp: [],
      tableDataTempAvg: [],
      resData: [], // 接口数据
      tableData: [], // table数据,倒序
      columnDataHour1: [
        { name: '时间', value: 'getTime' },
      ],
      columnDataHour2: [
        { name: '时间', value: 'getTime' },
      ],

      menuConfig: {
        className: 'my-menus',
        body: {
          options: [
            [
              { code: 'refresh', name: '表格刷新' },
              // { code: 'exportCurrent', name: '导出当前页', },
            ]
          ]
        },
      },
    } as any)


    const columnDataHour1 = computed(() => {
      for (let i = 0; i < 12; i++) {
        state.columnDataHour1.push({ name: `${i}时`, value: `h${i}` })
      }
      return state.columnDataHour1
    })
    const columnDataHour2 = computed(() => {
      for (let i = 12; i < 24; i++) {
        state.columnDataHour2.push({ name: `${i}时`, value: `h${i}` })
      }
      return state.columnDataHour2
    })



    const methods = {
      async open({ row }) {
        state.rowInfo = row;
        methods.getTableData()
        methods.getChartData()

        // 打开弹窗
        state.show = true;

      },
      // 编辑
      editTableTempUp() {
        state.edit = false;
      },
      // 取消编辑
      clearEditTempUp() {
        state.edit = true;
        // let tableData = state.tableRef.getTableData().tableData;
        let tableData = cloneDeep(state.tableDataTempUp);
        tableData.forEach(element => {
          for (let key in element) {
            if (element[key] === '') {
              element[key] = '0.00'
            }
            else if (key === 'conid') {
              element[key] = state.rowInfo?.conId
            } else if (key === 'mode') {
              element[key] = 0 // 供温
            }
          }
        });
        delete tableData[0].getTime
        delete tableData[0].getime
        methods.setTableData(tableData[0])
      },
    
      // 获取表格数据
      getTableData() {
        getConTimeoffsetData({
          conid: state.rowInfo?.conId,
        }).then(res => {
          if (res && res.data.length > 0) {
            // state.resData = res.data || [];
            let tableData = cloneDeep(res.data);
            tableData.forEach(item => {
              if (item.mode === 0) {
                // 0 表示供温曲线;1表示均温曲线
                for (let key in item) {
                  if (!item[key] && item[key] !== 'conid' && item[key] !== 'getime' && item[key] !== 'mode') {
                    item[key] = '0.00';
                  } else {
                    item[key] = Number(item[key]).toFixed(2);
                  }
                }
                item.getTime = '偏移'
                state.tableDataTempUp = [item]
              } else {
                for (let key in item) {
                  if (!item[key] && item[key] !== 'conid' && item[key] !== 'getime' && item[key] !== 'mode') {
                    item[key] = '0.00';
                  } else {
                    item[key] = Number(item[key]).toFixed(2);
                  }
                }
                item.getTime = '偏移'
                state.tableDataTempAvg = [item];
              }
            });
          } else {
            state.tableDataTempUp = [];
            state.tableDataTempAvg = [];
          }
        }).catch(e => {
          console.log(e)
          state.tableDataTempUp = [];
          state.tableDataTempAvg = [];
        })
      },
      // 设置表格数据
      setTableData(data) {
        setConTimeoffsetData(data).then(res => {
          if (res.code === '0') {
            ElMessage.success(res?.msg)
            methods.getTableData()
          } else {
            ElMessage.error(res?.msg)

          }
        }).catch(e => {
          console.log(e)
          ElMessage.error(e)
        })
      },

      // 获取图表数据
      getChartData() {
        getConTempTrend({
          conid: state.rowInfo?.conId,
        }).then(res => {
          if (res && res.data) {

            state.resData = cloneDeep(res.data);

            const supTemp = state.resData.supTempLine.concat(state.resData.supTempPoint)
            let supTempMax = Math.max(...supTemp.map(item => item.y));
            let supTempMin = Math.min(...supTemp.map(item => item.y));

            const yAxisSupMin = Math.round(supTempMin * 0.9)
            const yAxisSupMax = Math.round(supTempMax * 1.1)


            const seriesSupDataPoint = state.resData.supTempPoint.map(item => [item.x, item.y]);
            const seriesSupDataLine = state.resData.supTempLine.map(item => [item.x, item.y]);



            // 供温
            set(state.chartLeftData, 'yAxis[0].min', yAxisSupMin)
            set(state.chartLeftData, 'yAxis[0].max', yAxisSupMax)
            set(state.chartLeftData, 'series[1]data', seriesSupDataPoint)
            set(state.chartLeftData, 'series[0]data', seriesSupDataLine)


          } else {
            state.resData = [];
          }
        }).catch(e => {
          console.log(e)
          state.resData = [];
        })
      },
    }


    return {
      ...toRefs(state),
      ...methods,
      columnDataHour1,
      columnDataHour2,
    }
  }
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1239032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

部署你的第一个应用

&#x1f5d3;️实验环境 OS名称Microsoft Windows 11 家庭中文版系统类型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 &#x1f913;FastAPI 构建应用 #基于fastapi快速创建一个项目 rkun1LAPTOP-TUS5FU0D MINGW64 / $ mkdir k8s-appr…

Java引用和内部类

引用 引用变量 引用相当于一个 “别名”, 也可以理解成一个指针. 创建一个引用只是相当于创建了一个很小的变量, 这个变量保存了一个整数, 这个整数表示内存中的一个地址. new 出来的数组肯定是在堆上开辟的空间,那么在栈中存放的就是引用,引用存放的的就是一个对象的地址,代表…

ORB-SLAM3在windows11下的编译使用

01 写在前面 近期在学习SLAM&#xff0c;想部署一下ORB-SLAM3&#xff0c;但是自己电脑是win11系统&#xff0c;因此就想着在win11上部署一下。但是网上看了一些教程&#xff0c;有一些博客&#xff0c;但是可能不适合我这种情况把&#xff0c;就很纠结。先说下结果&#xff0…

写单元测试,没你想得那么简单!

前言 单元测试是什么我们就简单介绍一下&#xff1a; 单元测试是针对程序模块&#xff08;软件设计的最小单位&#xff09;来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。 接下来是本人对单元测试的理解和实践。里面没有废话&#xff0c;希望每句话能说到你心…

【数据库】数据库中的检查点Checkpoint,数据落盘的重要时刻

检查点(checkpoint) ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定…

天空分割技术解决方案

图像处理技术已经成为企业提升用户体验、优化产品和服务的重要工具。美摄科技&#xff0c;作为全球领先的AI图像处理技术提供商&#xff0c;一直致力于研发和应用最先进的技术&#xff0c;以满足企业的各种需求。今天&#xff0c;我们很高兴地向大家介绍我们的新一代产品——美…

git中的分支管理:git branch,git checkout,解决git中的分支冲突的方法【Git学习三】

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;Git等软件工具技术的使用 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要…

2023感恩节大促:跨境卖家如何借助海外网红营销赢得市场关注

随着全球贸易的日益发展&#xff0c;跨境电商行业变得愈发竞争激烈&#xff0c;各家卖家纷纷寻找新的营销策略以在大促期间脱颖而出。在2023年感恩节即将来临之际&#xff0c;海外网红营销成为许多卖家关注的热点。本文Nox聚星将和大家探讨跨境卖家如何充分利用海外网红营销&am…

《C++ Primer》第9章 顺序容器(三)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 9.5 额外的string操作&#xff08;P320&#xff09; 9.5.1 构造string的其他方法 const char *cp "hello, world!"; char arr[] { h,\0,i,\0 }; string s1(cp); // s1 "hello, world!…

什么是索引下推

索引下推介绍 索引下推&#xff08;INDEX CONDITION PUSHDOWN&#xff0c;简称 ICP&#xff09;是在 MySQL 5.6 针对扫描二级索引的一项优化改进。总的来说是通过把索引过滤条件下推到存储引擎&#xff0c;来减少 MySQL 存储引擎访问基表的次数以及 MySQL 服务层访问存储引擎的…

CSS伪类选择器详细讲解

前言 伪类选择器在CSS中起到的作用可以说是至关重要的&#xff0c;如果CSS没有伪类选择器&#xff0c;有很多效果都要借助js来完成&#xff0c;这样不仅代码量增加&#xff0c;维护起来你难度也大。这样程序员的工作量大&#xff0c;也违背了CSS诞生的作用&#xff0c;就是提高…

在Spring Boot中使用ECharts绘制数据图表

使用ECharts来完成一些花里胡哨的图表吧&#xff0c;一般这种需求我们在我们的客户端不太常见&#xff0c;但是&#xff0c;我们在后端进行各种数据统计的时候就会发现ECharts的优点了&#xff0c;比如我们常常做的柱状图&#xff0c;折线图&#xff0c;雷达图等可视化形式&…

阿里云发送短信

官方代码如下&#xff1a; // This file is auto-generated, dont edit it. Thanks. package com.aliyun.sample;import com.aliyun.tea.*;public class Sample {/*** 使用AK&SK初始化账号Client* param accessKeyId* param accessKeySecret* return Client* throws Excep…

windows系统安装ubuntu22.04虚拟机

镜像文件准备 镜像文件 官网 企业开源和Linux | Ubuntu 镜像下载地址 https://cn.ubuntu.com/download/server/step1 选择合适的版本下载 虚拟机安装 文件-- 新建虚拟机 选择镜像 修改安装路径 修改大小&#xff0c;最好60g&#xff0c;大一点 设置用户信息 设置虚拟机网络…

【NLP】培训LLM的不同方式

在大型语言模型&#xff08;LLM&#xff09;领域&#xff0c;存在多种具有不同手段、要求和目标的培训机制。由于它们有不同的用途&#xff0c;因此重要的是不要将它们相互混淆并了解它们适用的不同场景。 在本文中&#xff0c;我想概述一些最重要的训练机制&#xff0c;包括预…

技术or管理?浅谈测试人员的未来职业发展

我们在工作了一段时间之后&#xff0c;势必会感觉到自己已经积累了一些工作经验了&#xff0c;会开始考虑下一阶段的职业生涯会如何发展。测试人员在职业生涯中的不确定因素还是不少的&#xff0c;由于其入门门槛不高&#xff0c;不用学习太多技术性知识即可入行&#xff0c;所…

RH850 G3KH异常处理简述

目录 1.概述 2.异常处理后现场恢复 3.异常处理地址识别 4.小结 1.概述 我们首先来看&#xff0c;G3KH的关键寄存器&#xff0c;PSW PSW--Program status word PSW寄存器里有表征程序状态的flag&#xff0c;CPU操作状态的flag。如下 UM---是否是user mode&#xff1b;0--…

Java Spring

文章目录 SpringSpring 是什么&#xff1f;从Spring中获取Beanxml获取注解存储类注解⽅法注解bean命名规则类注解之间的关系 注解获取bean属性注⼊缺点 构造⽅法注⼊Setter 注⼊三种注⼊优缺点分析Resource&#xff1a;另⼀种注⼊关键字同⼀类型多个 Bean 报错处理 获取bean对象…

谈一谈什么是接口测试?怎样做接口测试?

扫盲内容&#xff1a; 1.什么是接口&#xff1f; 2.接口都有哪些类型&#xff1f; 3.接口的本质是什么&#xff1f; 4.什么是接口测试&#xff1f; 5.问什么要做接口测试&#xff1f; 6.怎样做接口测试&#xff1f; 7.接口测测试点是什么&#xff1f; 8.接口测试都要掌…

​极氪,中国传统汽车品牌电动化的样板间

这篇文章早就想写了&#xff0c;因为太忙的原因就一直跳票&#xff0c;正好最近两件事的出现&#xff0c;又触发了想写这篇文章的冲动。 两件事主要是&#xff1a; 一&#xff0c;10 月份各家陆续公布了单月销量以及累计销量&#xff1b; 二&#xff0c;极氪在北京正式发布了 …