vue和elementui实现多表格选择和查看已选的功能

2023-10-27

目录

功能描述

数据

HTML

js

CSS


功能描述

经常碰到需要写多个表格选择,并且可以查看已选项目的功能,实现功能大致如此:

 左侧是可选择的表,点击表展示每个表里可选字段,然后点击查看已选,可以展示以及选择的表格数据,如下图:(涉及敏感字符,所以图片处理了一下)

 这个功能,需要几个部分处理,数据格式(从后端请求来的数据)、HTML、js、CSS。这里记录一下,以后还能用。

数据

tableId: "表id"
tableName: "表名称"
tableCol:[{}],//表的数据——右侧可以勾选的部分
tableColsTitle:[{}]//表的表头,也需要id和name两部分

HTML

在抽屉里分为两个部分,引用的组件也是常用的,如下:

   <el-drawer v-model="drawer" size="40%" direction="ltr" :close-on-click-modal="false">
      <template #header>
        <h3>可选字段&nbsp;&nbsp;&nbsp;已选{{ optionString }}/{{ selectString }}</h3>
      </template>

      <el-tabs v-model="activeName" @tab-click="handleClick">
        <el-tab-pane label="可选字段" name="first">
          <el-row>
            <el-col :span="6">
              <ul class="ulclass">
                <li
                  v-for="(item, index) in getTableList"
                  :key="index"
                  :class="{ active: isActive === index }"
                  @click="setTableList(item, index)"
                >
                  <p>{{ item.tableName }}</p>
                </li>
              </ul>
            </el-col>
            <el-col :span="18">
              <el-table
                :data="gridData.tableCols"
                @selection-change="handleSelectionChange"
                :row-key="getRowKey"
                height="70vh"
                ref="multipleTable"
              >
                <el-table-column :reserve-selection="true" type="selection" width="55"></el-table-column>
                <el-table-column
                  v-for="(item, index) in gridData.tableColsTitle"
                  :prop="item.cId"
                  :label="item.cName"
                ></el-table-column>
              </el-table>
            </el-col>
          </el-row>
        </el-tab-pane>
        <el-tab-pane label="查看已选" name="second" class="second-tab">
          <el-row>
            <el-col :span="24">
              <div v-for="(item, index) in optiongridList">
                <h3 style="margin: 20px 0 10px 0; font-weight: 600">{{ item.tableName }}</h3>
                <el-table
                  :data="item.tableCols"
                  :row-key="getRowKey"
                  :header-cell-style="{ background: '#505d69', color: 'white' }"
                >
                  <el-table-column
                    v-for="(col, index) in item.tableColsTitle"
                    :prop="col.cId"
                    :label="col.cName"
                  ></el-table-column>
                </el-table>
              </div>
            </el-col>
          </el-row>
        </el-tab-pane>
      </el-tabs>

      <div slot="footer" style="display: flex; flex-direction: row-reverse">
        <el-button type="primary" @click="subimtData()" style="margin-left: 10px">确 定</el-button>
        <el-button @click="drawer = false">取 消</el-button>
      </div>
    </el-drawer>

js

有几个点击事件,如下:

    //获取表格数据 
    async getTableInfo() {
      let res = await axios.get('/xxx')
      // console.log(res, '所有表的字段')
      this.tabList = res.data.message
      this.tabList.forEach((item) => {
        item.tableCols.forEach((e) => {
          e.key = `${item.tableId}/${e.colId}`
        })
      })
      this.getTableList = this.tabList
      //默认展示第一个表
      this.setTableList(this.tabList[0], 0)
    },
    //点击左侧导航展示数据
    setTableList(item, index) {
      this.isActive = index
      this.gridData = item
      this.optiongridData.forEach((item) => {
        this.toggleSelection(item.tableCols)
      })
    },
  toggleSelection(rows) {
      if (rows) {
        this.$nextTick(() => {
          rows.forEach((row) => {
            this.$refs.multipleTable.toggleRowSelection(
              this.gridData.tableCols.find((item) => {
                return row.key == item.key
              }),
              true
            )
          })
        })
      }
    },



 //选择某行
    handleSelectionChange(val) {
      // console.log(val, '选中行')
      this.optiongridData = val
      this.optionString = this.optiongridData.length
    },
    async subimtData() {
      let parms = []
      if (this.optiongridData.length == 0) {
        this.$message.error('请选择数据')
        return
      }
      let list = JSON.parse(JSON.stringify(this.tabList))
      list.forEach((item) => {
        item.tableCols = []
      })

      list.forEach((item) => {
        this.optiongridData.forEach((col) => {
          if (col.key.split('/')[0] == item.tableId) {
            item.tableCols.push(col)
          }
        })
      })
      // console.log(list, '处理数据')
      parms = list.map((item) => {
        return {
          tableId: item.tableId,
          tableCol: item.tableCols.map((col) => {
            return col.colId
          })
        }
      })
      parms = parms.filter((item) => {
        return item.tableCol.length !== 0
      })
      let data = {
        templateData: JSON.stringify(parms)
      }
    //请求接口并传输数据
      this.drawer = false
    },

基本上涉及的事件都在上面。

CSS

<style scoped lang="scss">

.ulclass {
  // padding-left: 8/16rem;
  margin-bottom: 1.125rem;
  margin-left: 0;
  padding-left: 0;
  height: 72vh;
  overflow: auto;
  li {
    display: block;
    font-size: 14/16rem;
    margin: 0 5/16rem 5/16rem 0;
    line-height: 2rem;
    padding: 1/16rem 8/16rem;
    border: solid 1/16rem transparent;
    border-radius: 4/16rem;
    cursor: pointer;
    p {
      line-height: 1rem;
    }
    &:hover {
      background: #f5fafc;
      border-color: #e8eaec;
    }
    &.active {
      background: #f5fafc;
      border-color: #f4f9fd;
    }
  }
}
.active {
  color: rgb(1, 33, 128);
}

//项目详情
:deep(.el-dialog .el-dialog__body) {
  display: flex;
  margin-left: 30px !important;
  align-items: center;
}
:deep(.el-form-item__label) {
  font-weight: 700;
  font-size: 14px;
  color: #606266;
  align-content: center;
  margin: auto;
}
.spanclass {
  font-size: 14px;
  display: inline-block;
  line-height: 32px;
}
.second-tab {
  height: 75vh;
  overflow-y: auto !important;
}
:deep(.el-drawer__body) {
  display: flex;
  color: #505d69;
  flex-direction: column;
  justify-content: space-between;
}
</style>

以上就是多表格可选并查看已选的功能,都不麻烦就是,bug有点多……

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue和elementui实现多表格选择和查看已选的功能 的相关文章

随机推荐

  • 腾讯云2核4G服务器5M带宽轻量CPU性能、流量和系统盘测试

    腾讯云轻量应用服务器2核4G5M配置 自带5M公网带宽 5M带宽下载速度峰值可达640KB 秒 系统盘为60GB SSD盘 每月500GB流量包 折合每天16GB流量 腾讯云百科来详细说下腾讯云轻量应用服务器2核4G5M配置 CPU型号处理
  • 「速通Shell」建楼先搬砖,Shell变量四大分类

    目录 Shell变量 什么是变量 shell变量定义 shell变量分类 环境变量 常见变量 变量引用 变量赋值 本地变量 变量定义 变量引用 变量赋值 变量删除 位置参数变量 变量定义 变量引用 特殊变量 变量定义 变量引用 总结 上一篇
  • POJ--1328:Radar Installation (贪心)

    1 题目源地址 http poj org problem id 1328 2 解题思路 该题题意是为了求出能够覆盖所有岛屿的最小雷达数目 每个小岛对应x轴上的一个区间 在这个区间内的任何一个点放置雷达 则可以覆盖该小岛 区间范围的计算用 x
  • MySQL数据库命令行详解

    MySQL数据库命令行详解 基础操作 进入数据库 mysql u root p databaseName root是只用管理员账户 后面括号是自己想连接的数据库名称 可不写 进入mysql后在通过use databaseName来连接对应数
  • 小样本学习--学习记录

    之前在做课题的时候 把数据不均衡和小样本的概念混淆了 昨天看了一篇论文 面向小样本数据的机器学习方法研究综述 陈良臣 傅德印 这篇论文写的非常清晰 推荐阅读 网上的一些综述整理都是根据 小样本学习研究综述 赵凯琳 这篇论文 知乎上的一篇笔记
  • 哪些应用适合服务器虚拟化,哪些服务器和应用适合虚拟化?

    虚拟化如今很流行 你可能也想把你所有的物理机进行虚拟化 考虑到可移植性 部署和硬件利用等方面的好处 虚拟化的确是非常诱人的 不过 这并不意味着虚拟化是任何服务器或应用的最好解决方案 至少现在还不是 其挑战是如何判断到底哪些服务器和应用适合于
  • 优秀英语教材

    优秀英语教材的选择 本人是个学生 依照自己学习英语的经历发表一些浅见 请各位不要将以下内容做商业用途 误区 1 在我看来 简单地评判一本英语教材是否优秀 可以观察以下几点 1 有无CEFR欧洲标准评级 2 是否是近10年出版 3 是否是英美
  • 【磕盐随记】C++ CUDA编程的环境配置

    一 前言 最近写了个又臭又长的代码来验证idea 效果还行但速度太慢 原因是代码中包含了一个很耗时的模块 这个模块需要连续执行百次以上才能得到最终结果 经过实测模块每次执行消耗约20ms 而且两次执行之间没有先后关系 为了保证系统的实时性
  • VUE3 + TS + 父子组件传值

    VUE3 TS 父子组件传值 父组件 传入几个变量 并且有接受子组件函数 changeaddress
  • 【主席树启发式合并】【P3302】[SDOI2013]森林

    Description 给定一个 n 个节点的森林 有 Q 次操作 每次要么将森林中某两点联通 保证操作后还是个森林 要么查询两点间权值第 k 小 保证两点联通 强制在线 Limitation 1 leq n Q leq 80000 Sol
  • SpringBoot核心配置全面总结

    Spring Boot的核心配置文件用于配置Spring Boot程序 文件名字必须以application开始 这个既是底层源码的强制要求 也是SpringBoot的一种代码规约 有助于在开发层面利于代码规范管理 说明 以下内容接着i前面
  • Java中的Calendar日历API用法完全解析

    第一部分 Calendar介绍 Calendar 定义 public abstract class Calendar implements Serializable Cloneable Comparable
  • centos mysql jar 驱动包_JDBC连接Mysql数据库详解

    JDBC Java DataBase Connectivity 即Java数据库连接 简而言之 就是通过Java语言来操作数据库 我们可以把JDBC理解成是官方定义的一套操作所有关系型数据库的规则 规则即接口 也就是说 官方定义了一套操作所
  • java实现单点登陆(SSO)

    java实现单点登陆 SSO 网络域名必须完全一致 才代表同一站点 域名映射 访问后面的 会跳转到前面 单点登陆概念 多系统 单一位置登录 实现多系统同时登陆 常出现在互联网和企业级平台中 单点登陆一般是用于互相授信的系统 实现单一位置登录
  • Unity Shader简介

    Shader 中文名为着色器 对很多开发者来说它是一个神秘的存在 想学但是又不知道如何去学 或者学了一段时间发现Get不到它的点 始终感觉游离在外 无法开窍 本文来讲下如何从零基础入门Shader 目的在于让初学Shader的程序或者美术可
  • C++ MyHttpServer网络服务器实验

    C MyHttpServer网络服务器实验 一 实验要求 二 文件夹管理 三 实验结果 四 程序代码 C 课程老师把这一个实验分成了五个小实验 VS版本是2019的 涉及Http协议的请求处理 响应处理 多线程等 有一两个实验老师的示例代码
  • 原理图改动后更新PCB报错的解决方法

    今天我在用Altium Designer 20绘制PCB时遇到了一个情况 在更改了原理图以后再进行Update PCB Document的时候软件会提示错误 截图如下 遇到这种情况时大家往往束手无策而选择重新建立一个空白的PCB板再去生成一
  • Spring MVC传递List类型参数报错:No primary or default constructor found for interface java.util.List]使用两种注解解决

    在测试GenericConverter传递List数组的时候 出现No primary or default constructor found for interface java util List with r这个错误 解决 因为报错
  • 单图像超分辨率重建总结

    单图像超分辨率重建总结 定义 单图像超分辨率重建 Single Image Super resolution Reconstruction SISR 旨在从给定的低分辨率 LR 图像中 重建含有清晰细节特征的高分辨率 HR 图像 是计算机视
  • vue和elementui实现多表格选择和查看已选的功能

    目录 功能描述 数据 HTML js CSS 功能描述 经常碰到需要写多个表格选择 并且可以查看已选项目的功能 实现功能大致如此 左侧是可选择的表 点击表展示每个表里可选字段 然后点击查看已选 可以展示以及选择的表格数据 如下图 涉及敏感字