维护el-table列,循环生成el-table

1、lib/setting.js(维护table列)

const columns=[
	{ label: '类型', prop: 'energyName', width: '150', isText: true },
	{ label: '消耗量(t或10⁴m³)', prop: 'inputNum', isInput: true },
	{
	  label: 'CO₂',
	  children: [
		// { label: '核算因子', prop: 'co2FactorValue', width: '120', isShow: false },
		{ label: '排放量', prop: 'co2Value', width: '120' },
		{ label: '排放因子', prop: 'co2FactorType', isSelect: true }
	  ]
	},
	{
	  label: 'CH₄',
	  children: [
		// { label: '核算因子', prop: 'ch4FactorValue', width: '120' },
		{ label: '排放量', prop: 'ch4Value', width: '120' },
		{ label: '排放因子', prop: 'ch4FactorType', isSelect: true }
	  ]
	},
	{
	  label: 'N₂O',
	  children: [
		{ label: '排放量', prop: 'n2oValue', width: '120' },
		{ label: '排放因子', prop: 'n2oFactorType', isSelect: true }
	  ]
	}
  ]

2、customTable.vue

<template>
	<slot name="title"> </slot>
<!-- show-summary  -->
	<el-table :data="tableData" show-summary style="width: 99%;" class="elTable">
		<el-table-column v-for="(column, index) in columns" :key="index" :prop="column.prop" :label="column.label" :width="column.width">
			<template v-if="!column.children" #default="scope">
				<div>
					{{ column.isText ? scope.row[column.prop] : "" }}
					<el-input v-if="column.isInput" v-model="scope.row[column.prop]" @change="inputNum(scope.row)" :disabled="props.isDetail"/>
					<input-select-module v-if="column.isSelect"></input-select-module>
				</div>
			</template>
			<template v-if="column.children">
				<el-table-column v-for="(subColumn, subIndex) in column.children"  :key="subIndex" :prop="subColumn.prop" :label="subColumn.label" :width="subColumn.width">
					<template #default="scope">
						<el-input v-if="subColumn.isInput" v-model="scope.row[subColumn.prop]" :disabled="props.isDetail"/>
						<input-select-module v-if="subColumn.isSelect" v-model:row="scope.row" v-model:disabled="props.isDetail" v-model:subColumn="subColumn.prop" @changeFactorValue="changeFactorValue(scope.row, scope.row[subColumn.prop])"></input-select-module>
					</template>
				</el-table-column>
			</template>
		</el-table-column>
	</el-table>
</template>

在这里插入图片描述

做了个自定义组件
组件描述:选择值为缺省值时,该组件为下拉框,选择值为自测值时,组件为输入框

<template>
  <div>
    <!-- v-model="props.inputVal" -->
    <el-input type="text" v-model="props.row[props.subColumn]" @change="changeInput(props.row[props.subColumn])"
      id="input-select" @click="click" :readonly="inputReadonly" style="position: relative" />
    <div class="dropdown" :style="dropdownStyle">
      <div class="dropdown-item" data-value="自测值" @click="clickdropdown('自测值')">自测值</div>
      <div class="dropdown-item" data-value="缺省值" @click="clickdropdown('缺省值')">缺省值</div>
    </div>
  </div>
</template>

<script setup>
import { ref, defineEmits, watch } from 'vue'

const props = defineProps({
  subColumn: {
    type: String,
    required: true
  },
  row: {
    type: Object,
    required: true
  },
  disabled: {
    type: Boolean,
  },
})

const emit = defineEmits(['changeFactorType'])

const inputReadonly = ref(true)
const dropdownStyle = ref({ display: 'none' })

window.addEventListener('click', (event) => {
  if (!props.disabled) {
    if (event.target.id != 'input-select') {
      dropdownStyle.value = { display: 'none' }
    } else {
    }
  }
})
window.addEventListener('scroll', function () {
  for (var i = 0; i < document.getElementsByClassName("dropdown").length; i++) {
    document.getElementsByClassName("dropdown")[i].style.display = 'none';
  }
}, true)

const click = (event) => {
  debugger
  if (!props.disabled) {
    for (var i = 0; i < document.getElementsByClassName('dropdown').length; i++) {
      document.getElementsByClassName('dropdown')[i].style.display = 'none'
    }

    var rect = event.target.getBoundingClientRect();

    // 打印元素的位置
    let top=rect.top+32;
    let left=rect.left-10;
    dropdownStyle.value = {
        display: 'block',
        position: 'fixed',
        top:top+'px',
        left:left+"px",
        border: '#909399 1px solid',
        'border-radius': '4px',
        background: '#fff',
        'z-index': '100',
        width: '150px'
      }
  }
}

// 选择自测值,缺省值,控制下拉框显隐
// 选择:缺省值-计算方式:消耗量*默认核算因子
// 选择:自测值-排放因子输入框清空,手动填写
const clickdropdown = (val) => {

  dropdownStyle.value = { display: 'none' }
  if (val == '缺省值') {
    props.row[props.subColumn] = val
    props.subColumn == 'co2FactorType'
      ? (props.row.co2Value = props.row.inputNum * props.row.co2FactorValue)
      : props.subColumn == 'ch4FactorType'
        ? (props.row.ch4Value = props.row.inputNum * props.row.ch4FactorValue)
        : (props.row.n2oValue = props.row.inputNum * props.row.n2oFactorValue)
    inputReadonly.value = true
    dropdownStyle.value = { display: 'none' }
  } else if (val == '自测值') {
    props.subColumn == 'co2FactorType'
      ? (props.row.co2Value = '')
      : props.subColumn == 'ch4FactorType'
        ? (props.row.ch4Value = '')
        : (props.row.n2oValue = '')
    props.row[props.subColumn] = ''
    inputReadonly.value = false
    dropdownStyle.value = { display: 'none' }
  }
}

// 排放因子为自测值时,计算排放量,计算公式:消耗量 * 排放因子
const changeInput = (value) => {
  if (value != '自测值' && value != '缺省值') {
    if (!/^-?\d+(\.\d+)?$/.test(value)) {
      ElMessage.error('输入不合法')
      props.row[props.subColumn] = ''
      props.subColumn == 'co2FactorType'
        ? (props.row.co2Value = '')
        : props.subColumn == 'ch4FactorType'
          ? (props.row.ch4Value = '')
          : (props.row.n2oValue = '')
    } else if (props.row.inputNum != '') {
      props.subColumn == 'co2FactorType'
        ? (props.row.co2Value = props.row.inputNum * value)
        : props.subColumn == 'ch4FactorType'
          ? (props.row.ch4Value = props.row.inputNum * value)
          : (props.row.n2oValue = props.row.inputNum * value)
    }
  }
}

</script>

<style>
.dropdown {
  border: #3f3f3f 1px solid;
  position: absolute;
  width: 120px;
}

.dropdown-item {
  cursor: pointer;
  text-indent: 8px;
}
</style>

在这里插入图片描述

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

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

相关文章

IC烧录员-带着工程师的梦想远航!

如果说软件工程师是代码程序的创造者&#xff0c;那么IC烧录员就是把工程师们辛苦敲代码&#xff0c;日夜辛劳的成果烧录到芯片里面的实践者&#xff0c;是他们&#xff0c;让工程师们的梦想运用到实践中&#xff0c;是他们带着工程师的梦想远航&#xff0c;他们的薪酬或许没有…

SprongBoot3整合Knife4j实现在线接口文档

大家好&#xff0c;我是晓凡。 写在前面 在上一篇文章&#xff0c;我们详细介绍了SpringBoot3 怎么整合SpringDoc实现在线接口文档。但是&#xff0c;有不少小伙伴 都觉得接口界面太丑了。有没有什么更美观一点的UI界面呢&#xff1f; 当然是有的了&#xff0c;毕竟这是一个…

temu a4接口 逆向

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi …

c++习题09-分离整数的各个数

目录 一&#xff0c;题目 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;题目 二&#xff0c;思路 一开始我想到的是将简单容易输出的1000以内的数先进行相应的运算&#xff0c;再输出之后再对1000以上的数字进行判断&#xff08;主要还是想先将很大的数变小&#x…

每日一题——Python实现PAT乙级1026 程序运行时间(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码结构和逻辑 时间复杂度 空间复杂度 代码优化建议 总结 我要更强 …

生物分子生物学实验过程的自动化与智能监控系统设计

开题报告&#xff1a;生物分子生物学实验过程的自动化与智能监控系统设计 一、引言 随着生物科学技术的飞速发展&#xff0c;生物分子生物学实验在科研、医疗、农业等领域的应用日益广泛。然而&#xff0c;传统的生物分子生物学实验过程大多依赖于人工操作&#xff0c;存在操…

组件丰富、支持2/3D数据可视化的编辑器平台软件?

数据可视化编辑器通常用于创建交互式的图表和模型&#xff0c;可以帮助用户以更直观的方式展示数据。一些在线平台软件提供了丰富的组件&#xff0c;支持2D和3D数据可视化&#xff1a; 1、Plotly - 提供了多种语言的库&#xff0c;支持在线创建交互式图表&#xff0c;包括2D和…

【2023ICPC网络赛I 】E. Magical Pair

当时在做洛谷U389682 最大公约数合并的时候我就想到把每个质因子分解出来然后跑高维前缀和&#xff0c;但是那一道题不是用这个方法&#xff0c;所有我也一直在思考这种做法是不是真的有用。因为昨天通过2024上海大学生程序设计竞赛I-六元组计数这道题我了解到了不少关于原根的…

平安养老险安徽分公司:助力乡村振兴 保险知识进农村

为深入宣传普及保险理念&#xff0c;进一步提升服务品质&#xff0c;营造“78全国保险公众宣传日”活动氛围&#xff0c;助力保险业健康稳定发展&#xff0c;近日&#xff0c;平安养老保险股份有限公司&#xff08;以下简称“平安养老险”&#xff09;安徽分公司走进安庆市宿松…

智能座舱相关问答

一、基本概念与理解 智能座舱的定义 回答&#xff1a;智能座舱是指在现代交通工具中&#xff0c;通过应用智能技术&#xff0c;实现对乘客座舱环境和服务进行智能化管理和优化的系统。它不仅提供更加舒适的乘坐体验&#xff0c;还能通过精确的数据分析和实时监控&#xff0c;提…

教育行业的网络安全:保护学生数据与防范网络欺凌

在数字化的春风中&#xff0c;教育行业迎来了知识的繁花似锦&#xff0c;然而&#xff0c;随之而来的网络安全风暴也悄然逼近。学生数据的脆弱性与网络欺凌的阴影交织成一幅复杂的画卷&#xff0c;呼唤着教育工作者与技术专家共同编织一张密不透风的网络安全之网。本文深入探讨…

A*——AcWing 178. 第K短路

A* 定义 A算法是一种广泛应用于路径搜索和图遍历的启发式搜索算法&#xff0c;它结合了最好优先搜索和Dijkstra算法的优点&#xff0c;旨在找到从初始节点到目标节点的最短路径。A算法在游戏AI、机器人导航、地图路线规划等领域有广泛应用。 A*算法的核心在于使用一个评估函…

React+TS前台项目实战(二十四)-- 全局常用绘制组件Qrcode封装

文章目录 前言Qrcode组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示(pc端 / 移动端) 总结 前言 今天要封装的Qrcode 组件&#xff0c;是通过传入的信息&#xff0c;绘制在二维码上&#xff0c;可用于很多场景&#xff0c;如区块链项目中的区块显示交易地址时就可以用到…

顶顶通语音信箱手机助手拦截方案(mod_cti基于FreeSWITCH)

文章目录 前言联系我们拦截方案方案一&#xff1a;空号识别拦截拦截时间原理能够识别出的状态 方案二&#xff1a;实时质检拦截拦截时间原理拦截效果展示 服务器配置要求 前言 顶顶通拥有两种语音信箱手机助手拦截方案&#xff1a; 方案一&#xff1a;空号识别拦截&#xff0…

springboot接口防抖【防重复提交】

什么是防抖 所谓防抖&#xff0c;一是防用户手抖&#xff0c;二是防网络抖动。在Web系统中&#xff0c;表单提交是一个非常常见的功能&#xff0c;如果不加控制&#xff0c;容易因为用户的误操作或网络延迟导致同一请求被发送多次&#xff0c;进而生成重复的数据记录。要针对用…

成都百洲文化传媒有限公司电商服务的佼佼者

在当今这个数字化时代&#xff0c;电商已成为商业发展的核心动力之一。成都百洲文化传媒有限公司&#xff0c;作为一家专注于电商服务的领先企业&#xff0c;正以其卓越的服务质量和前瞻性的战略眼光&#xff0c;引领着电商行业的新潮流。 一、公司简介 成都百洲文化传媒有限公…

sssssssssssssssshare_ptrrrrrrrrrrrrrrrrrrrrrrrrr

智能指针——shared_ptr的原理及仿写 shared_ptr的原理及仿写 共享指针允许多个指针指向同一份数据&#xff0c;因为它使用了引用计数&#xff0c;每多一个指针指向这个数据&#xff0c;引用技术加一&#xff0c;每销毁一个指针&#xff0c;引用技术减一&#xff0c;如果引用计…

拓展欧几里得和裴蜀定理

裴蜀定理&#xff08;或贝祖定理&#xff09;说明了对任何整数a、b和它们的最大公约数d&#xff0c;关于未知数x和y的线性不定方程&#xff08;称为裴蜀等式&#xff09;&#xff1a;若a,b是整数,且gcd(a,b)d&#xff0c;那么对于任意的整数x,y,axby都一定是d的倍数&#xff0c…

【安全攻防】网络安全中的序列化与反序列

1.序列化与反序列化 首先要了解序列化与反序列化的定义&#xff0c;以及序列化反序列化所用到的基本函数。 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化&#xff0c;相当于游戏中的存档。 PHP中的序列化函数serialize() **serialize()**函数用于序列化对…

jsqlparse工具拦截sql处理和拓展

前置知识 访问者模式 &#xff08;Visitor Pattern&#xff09;是一种行为设计模式&#xff0c;它允许你定义在不改变被访问元素的类的前提下&#xff0c;扩展其功能。通过将操作&#xff08;操作或算法&#xff09;从对象结构中提取出来&#xff0c;可以在不修改这些对象的前…