当前位置: 首页 > news >正文

vue原生table表格实现动态添加列,一行添加完换行继续添加。el-select输入框背景颜色根据所选内容不同而改变

效果如下

动态添加列

代码如下


<template><div class="table-container"><button @click="addColumn">添加列</button><div class="scroll-container"><div class="table-grid"><div v-for="(row, rowIndex) in tableRows" :key="rowIndex" class="table-row"><table class="dynamic-table"><tbody><tr><td  :colspan="row.length*6">&nbsp;</td></tr><tr><td colspan="6" v-for="col in row" :key="col.id">{{col.id}}</td></tr><tr><td  v-for="n in row.length*6" :key="n">{{ n%6==0?6:n%6 }}</td></tr><tr  class="custom-row"><td colspan="6"  v-for="col in row" :key="col.id"><el-select style="height: 100px;" v-model="col.select1" placeholder="请选择"  :class="className[col.id]"  @change="handleChange($event,col.id)"><el-optionv-for="item in options":key="item.value":label="item.value":value="item.value"></el-option></el-select></td></tr><tr><td colspan="6" v-for="col in row" :key="col.id"><el-select v-model="col.select2" placeholder="请选择"><el-optionv-for="item in optionsFm":key="item":label="item":value="item"></el-option></el-select></td></tr></tbody></table></div></div></div></div>
</template><script>
export default {data() {return {columns: [],options: [{ value: 'danger', label: '危险操作', bgColor: 'classRed' },{ value: 'warning', label: '警告操作', bgColor: 'classBlue' }],optionsFm: ['FM-1', 'FM-2', 'FM-3','FM-4'],maxColsPerRow: 23,nextId: 1,currentBgColor: '',className:[],}},computed: {tableRows() {const rows = []for (let i = 0; i < this.columns.length; i += this.maxColsPerRow) {const row = this.columns.slice(i, i + this.maxColsPerRow)// 奇数行反转实现蛇形排列// if (Math.floor(i / this.maxColsPerRow) % 2 === 0) {//   row.reverse()// }// rows.push(row)rows.push(this.columns.slice(i, i + this.maxColsPerRow))}return rows.length ? rows : [[]]}},methods: {handleChange(val,id) {const selected = this.options.find(item => item.value === val)this.className[id] = selected ? selected.bgColor : ''},addColumn() {this.columns.push({id: this.nextId++,select1: '',select2: ''})}}
}
</script><style scoped>
.table-container {padding: 20px;height: 100%;
}
.scroll-container {height: calc(100vh - 70px);overflow-y: auto;margin-top: 10px;border: 1px solid #ddd;
}
.table-grid {display: flex;flex-direction: column;gap: 20px;
}
.dynamic-table {border: 1px solid #000;border-collapse: collapse;display: inline-block;
}
.dynamic-table td {border: 1px solid #000;padding: 3px;width: 6px;text-align: center;
}
.dynamic-table select {width: 100%;padding: 5px;
}
.number-cells {display: flex;justify-content: space-around;
}
button {padding: 8px 16px;background: #42b983;color: white;border: none;border-radius: 4px;cursor: pointer;
}
button:hover {background: #3aa876;
}
/deep/.custom-row .el-input__inner{height: 100px;
}/deep/.classRed .el-input__inner{background-color: #FEA0F7;}
/deep/.classBlue .el-input__inner{background-color: #00FFFF;}</style>

相关文章:

  • 深入解读RTP协议:RFC 3550的技术分析与应用
  • 在线地图瓦片URL
  • Spring Framework 的 spring-core 和 Spring Security 兼容版本
  • springboot3+vue3融合项目实战-大事件文章管理系统-自定义校验
  • 预警功能深度测评:如何用系统降低设备突发故障率?
  • 基于 STM32 的 PC ARGB 风扇控制器设计与实现
  • 工作安排小K
  • Elasticsearch生产环境性能调优指南
  • Unity中GPU Instancing使用整理
  • 全方位详解微服务架构中的Service Mesh(服务网格)
  • 互联网大厂Java求职面试:Spring Cloud微服务架构与AI集成挑战
  • 如何在 Android 手机和平板电脑上下载应用程序
  • ATT Global赞助非小号全球行,引领RWA创新浪潮
  • springboot 1.x2.x依赖spring版本
  • MySQL 5.7 实战:JSON 字段提取、Base64 解码与引号问题全解析
  • 无人机电子防抖技术要点概述!
  • 20个关于Java编程语言的常见问题
  • Redis SETNX:分布式锁与原子性操作的核心
  • SPL做量化---PSY(心理线)
  • 【人工智能基础知识】
  • 如何做品牌网站设计/seo搜索引擎优化工程师招聘
  • 百度的网址是什么呢/网站关键词排名手机优化软件
  • 亚马逊网站建设案例/独立站seo是什么
  • 积分商城网站开发/域名收录