vxe编辑保存表格

业务需求:

        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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux设置静态IP

Linux设置静态IP 使用ip addr查看ip&#xff0c;如下所示就是动态IP 1、什么是静态IP&#xff1f; 静态ip就是固定的ip&#xff0c;需要手动设置。静态IP地址&#xff08;又称固定IP地址&#xff09;是长期分配给一台计算机或网络设备使用的 IP 地址。一般来说&#xff0c;一…

电商平台API接口的作用到底是什么?重要性又是什么?具体接入方式?

电商平台API接口的重要性及其作用主要体现在以下几个方面&#xff1a; 数据支持&#xff1a;电商平台拥有大量的商品信息、用户信息、交易信息等大数据资产&#xff0c;而API接口提供访问这些数据的途径&#xff0c;使得其他软件、应用、网站等可以利用这些数据提供更丰富的功…

【三维几何学习】自制简单的网格可视化软件 — Mesh Visualization

自制简单的网格可视化软件 — Mesh Visualization 引言一、整体框架1.1 三角形网格1.2 界面管理1.3 VTK可视化界面 二、核心源码2.1 三角形网格&#xff1a;TriMesh类2.2 界面Widget_Mesh_Manager2.3 VTK可视化2.4 main 引言 使用PyQt自制简单的网格可视化软件 - 视频展示 本是…

Echarts实现散点图

效果图如下&#xff1a; <html><head><meta charsetutf-8><link rel"stylesheet" href"js/leaflet1.7.1/dist/leaflet.css"/><script src"js/leaflet1.7.1/dist/leaflet.js"></script><script src"…

win10 eclipse安装教程

前言&#xff1a;安装eclipse之前必须安装JDK&#xff0c;JDK是编译环境&#xff0c;eclipse是集成开发平台。 一、JDK的安装 Java Development Kit 简称 JDK (一). 官方下载地址&#xff1a; Java Archive Downloads - Java SE 8u211 and later (oracle.com) 找到&#xf…

用Stable Diffusion帮助进行卡通风格渲染

用Stable Diffusion帮助进行卡通风格渲染 正常风格渲染卡通风格贴图增加涅斐尔边缘高光效果 正常风格渲染 正常的动物写实模型 卡通风格贴图 用Stable Diffusion可以帮助我们将写实贴图转化为卡通风格&#xff08;具体参数可以自己调试&#xff0c;总体上是将提示词强度和图…

《QT从基础到进阶·三十八》QWidget实现炫酷log日志打印界面

QWidget实现了log日志的打印功能&#xff0c;不仅可以在界面显示&#xff0c;还可以生成打印日志。先来看下效果&#xff0c;源码放在文章末尾&#xff1a; LogPlugin插件类管理log所有功能&#xff0c;它可以获取Log界面并能打印正常信息&#xff0c;警告信息和错误信息&…

【101011011序列检测_2023.11.20】

源文件 tb文件in输入&#xff1a;01010‘1011011’0 VCS仿真结果 当next_state为s9时&#xff0c;out置为1

软考中级哪个科目最简单?

那必须是系统集成项目管理工程师&#xff01; 系统集成项目管理工程师考试内容少&#xff0c;题型简&#xff0c;报考门槛低&#xff0c;零基础就能报考&#xff0c;学习内容比较简单&#xff0c;接近工作和生活。 系统集成项目管理工程师证书是中国计算机技术职业资格&#…

【React-Router】嵌套路由

1. 嵌套路由 在一级路由中又内嵌了其他路由&#xff0c;这种关系就叫做嵌套路由。 2. 嵌套路由配置 // /page/About/index.js const About () > {return (<div>二级路由 About 组件</div>) }export default About// /page/Layout/index.js import { Outlet, …

Ajax技

Ajax的特点 异步提交&#xff1a;Ajax采用异步通信方式&#xff0c;能够在页面无需重新加载的情况下向服务器发送请求并接收响应数据&#xff0c;提升了用户体验。无需插件&#xff1a;Ajax是基于标准浏览器的Javascript和XMLHttpRequest对象实现的&#xff0c;无需安装插件或…

【kubernetes】k8s架构之节点

文章目录 1、集群架构示意图2、概述3、管理3.1 节点名称唯一性3.2 节点自注册3.3 手动节点管理 4、节点状态4.1 地址&#xff08;Addresses&#xff09;4.2 状况&#xff08;Condition&#xff09;4.3 容量&#xff08;Capacity&#xff09;与可分配&#xff08;Allocatable&am…

关于一些bug的解决1、el-input的输入无效2、搜索之后发现数据不对3、el多选框、单选框点击无用4、

el-input输入无效 原来的代码是 var test null 但是我发现不能输入任何值 反倒修改test的初始值为123是可以的 于是我确定绑定没问题 就是修改的问题 于是改成 var test ref&#xff08;&#xff09; v-model绑定的值改成test.value就可以了 因为ref是相应式的 可以通过输入…

minio安装使用-linux

下载地址&#xff1a;MinIO | Code and downloads to create high performance object storage 选择 minio server 可以直接下载二进制文件。 将下载的文件传输到服务器的指定文件夹下&#xff0c;如 /opt/minio。 然后在&#xff0c;命令行启动minio&#xff1a; /opt/mini…

Nginx高级

Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云服务资源增加 整机&#xff1a;IBM、浪潮、DELL、HP等 CPU/主板&#xff1a;更新到主流 网卡&#xff1a;10G/40G网卡 磁盘&#xff1a;SAS(SCSI) HDD&#xff08;机械…

智慧社区建设管理方案,AI技术让小区更智能、更舒适

一、背景与需求分析 智慧社区是充分应用大数据、云计算、人工智能等信息技术手段&#xff0c;整合社区各类服务资源&#xff0c;打造基于信息化、智能化管理与服务的社区治理新形态。根据《关于深入推进智慧社区建设的意见》&#xff0c;到2025年&#xff0c;基本构建起网格化…

生活如果真能像队列一样的话

生活如果真能像队列一样&#xff0c;那该多好啊。 —————————————————————————————————————————— 背包&#xff0c;队列 可以先看他们的API&#xff1a;都含有一个无参构造函数&#xff0c;添加单个元素的方法&#xff0c;测试集合…

从零开始学习typescript——什么是typescript

什么是typescript typescript是javascript 类型的超级&#xff0c;他可以编译成纯javascript. TypeScript可以在任何浏览器、任何计算机和任何操作系统上运行&#xff0c;并且是开源的。 这个是typescript 官网对 typescript的描述 背景及特点 TypeScript是微软开发的一个开源…

机器学习/sklearn 笔记:K-means,kmeans++

1 K-means介绍 1.0 方法介绍 KMeans算法通过尝试将样本分成n个方差相等的组来聚类&#xff0c;该算法要求指定群集的数量。它适用于大量样本&#xff0c;并已在许多不同领域的广泛应用领域中使用。KMeans算法将一组样本分成不相交的簇&#xff0c;每个簇由簇中样本的平均值描…