首页 > 其他分享 >实现el-table行展开可以定位到指定行功能

实现el-table行展开可以定位到指定行功能

时间:2024-07-23 14:08:04浏览次数:10  
标签:el return 定位 label table prop row


实现方法
1.拿到每一行的高度,
2.再拿到每一行展开行的高度
3.累加起来,让滚动条滚动到对应的高度

tableScrollToRow(tableElement, rowIndex) {
      const expandedRows = tableElement.bodyWrapper.querySelectorAll(".el-table__expanded-cell");
      const theTableRows = tableElement.bodyWrapper.querySelectorAll(".el-table__body tbody .el-table__row");
      let totalHeight = 0;
      // 计算特定行之前所有行的高度之和
      for (let i = 0; i < rowIndex; i++) {
        totalHeight += theTableRows[i].offsetHeight;
        // 如果当前行有展开行,累加展开行的高度
        if (expandedRows[i]) {
          totalHeight += expandedRows[i].offsetHeight;
        }
      }
      // 设置滚动条位置
      tableElement.bodyWrapper.scrollTop = totalHeight;
}

完整代码

<template>
  <div>
    <div class="flexBoxBetween">
      <div class="leftTable">
        <div
          v-for="item in mediaList"
          @click="changeLightMedia(item)"
          :class="
            lightMediaId == item.mediaId
              ? 'itemLeft backgroundBlue'
              : 'itemLeft'
          "
        >
          {{ item.mediaName }}
        </div>
      </div>
      <el-table
        ref="table"
        :data="tableData"
        class="customer-no-border-table"
        v-loading="load"
        element-loading-text="数据正在加载中..."
        :row-class-name="tableRowClassName"
        :header-cell-style="{ background: '#E7F2FD', color: '#252525' }"
        style="width: 100%; border-top: 1px solid #409eff"
        height="450"
        border
        :row-key="row => row.mediaId"
        :expand-row-keys="expandedRows"
      >
        <el-table-column>
          <el-table-column type="expand">
            <template slot-scope="{ row }">
              <el-form
                label-position="left"
                inline
                class="expand"
              >
                <el-row
                  v-for="(item, index) in row.onlyPlayList"
                  :key="index"
                >
                  <el-form-item label="独立播放开始时间">
                    <el-time-select
                      v-model="item.onlyStartTime"
                      placeholder="独立播放开始时间"
                      disabled
                      style="width: 150px"
                    >
                    </el-time-select>
                  </el-form-item>
                  <el-form-item label="独立播放结束时间">
                    <el-time-select
                      v-model="item.onlyEndTime"
                      placeholder="独立播放开始时间"
                      disabled
                      style="width: 150px"
                    >
                    </el-time-select>
                  </el-form-item>
                </el-row>
              </el-form>
            </template>
          </el-table-column>
        </el-table-column>
        <template v-for="(item, index) in columns">
          <el-table-column
            :key="index"
            :width="item.width"
            :prop="item.prop"
            :label="item.label"
            :formatter="item.formatter"
            align="center"
            show-overflow-tooltip
          >
          </el-table-column>
        </template>
        <div
          slot="empty"
          style="margin-top: 80px"
        >
          <img
            src="@/assets/noReport.png"
            alt="暂无数据"
          />
        </div>
      </el-table>
    </div>
    <!-- 分页 -->
    <div style="
        height: 80px;
        display: flex;
        justify-content: center;
        align-items: center;
      ">
      <el-pagination
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        :current-page="page"
        :page-sizes="[10, 20, 30, 40]"
        :page-size="size"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total"
      >
      </el-pagination>
    </div>
  </div>
</template>

<script>
import { getBuildOnlyPlayMediaList } from "_config/url.js";
export default {
  props: {
    tabName: {
      type: String,
      default: "",
    },
    row: {
      type: Object,
      default: () => ({}),
    },
  },
  data() {
    return {
      load: false,

      lightMediaId: "", //高亮的媒体名称ID
      mediaList: [], //媒体名称列表
      tableData: [],
      columns: [
        {
          prop: "mediaName",
          label: "媒体名称",
        },
        { prop: "mediaBelongCompany", label: "所属公司" },
        { prop: "province", label: "投放区域" },
        {
          prop: "mediaType",
          label: "媒体类型",
          formatter: (row, column, cellValue, index) => {
            switch (cellValue) {
              case 0:
                return "视频";
              case 1:
                return "图片/音频";
            }
          },
        },
        { prop: "rotateGap", label: "轮换间隔" },
        {
          prop: "screenType",
          label: "屏幕类型",
          formatter: (row, column, cellValue, index) => {
            switch (cellValue) {
              case 0:
                return "横屏";
              case 1:
                return "全部";
            }
          },
        },
        { prop: "mediaPlayCompany", label: "投放公司" },
        { prop: "startPlay", label: "开始播放时间", width: "120px" },
        {
          prop: "endPlay",
          label: "结束播放时间",
          width: "120px",
          formatter: (row, column, cellValue, index) => {
            if (cellValue) {
              return cellValue;
            } else {
              return "无限期";
            }
          },
        },
      ],
      page: 1,
      size: 10,
      total: 0,
      expandedRows: [],
    };
  },
  mounted() {
    this.searchList("search");
  },
  methods: {
    changeLightMedia(item) {
      this.lightMediaId = item.mediaId;
      this.tableScrollToRow(this.$refs.table, item.index);
    },
    /**
     *  el-table滚动到表格某一行
     *  @param {object} tableElement  表格元素(this.$refs['表格ref值'])
     *  @param {Number} rowIndex   滚动到第几行(从0开始)
     */
    tableScrollToRow(tableElement, rowIndex) {
      const expandedRows = tableElement.bodyWrapper.querySelectorAll(".el-table__expanded-cell");
      const theTableRows = tableElement.bodyWrapper.querySelectorAll(".el-table__body tbody .el-table__row");
      let totalHeight = 0;
      // 计算特定行之前所有行的高度之和
      for (let i = 0; i < rowIndex; i++) {
        totalHeight += theTableRows[i].offsetHeight;
        // 如果当前行有展开行,累加展开行的高度
        if (expandedRows[i]) {
          totalHeight += expandedRows[i].offsetHeight;
        }
      }
      // 设置滚动条位置
      tableElement.bodyWrapper.scrollTop = totalHeight;

      // 在循环之外执行以下操作(标红选中的行)
      // for (let i = 0; i < theTableRows.length; i++) {
      //   if (i === rowIndex) {
      //     const rowEl = theTableRows[i];
      //     // 触发该行鼠标移入效果
      //     const hoverEvent = new MouseEvent('mouseenter', { bubbles: true, cancelable: true, view: window });
      //     rowEl.dispatchEvent(hoverEvent);
      //     // 选中的那一行指定背景色
      //     rowEl.style.backgroundColor = 'red';
      //   } else {
      //     theTableRows[i].style.backgroundColor = '#ffffff';
      //   }
      // }
    },
    async searchList(flag) {
      this.lightMediaId = "";
      if (flag) {
        this.page = 1;
        this.size = 10;
      }
      this.load = true;
      try {
        const res = await this.$postJson(getBuildOnlyPlayMediaList, {
          buildCode: this.row.buildCode,
          playStatus: this.tabName == "playedMedia" ? 1 : 0,
          page: this.page,
          size: this.size,
        });
        console.log("

标签:el,return,定位,label,table,prop,row
From: https://www.cnblogs.com/hxy--Tina/p/18318261

相关文章

  • Pycharm社区版在外部安装了selenium,ddt在项目中却无法用(安装了第三方包pycharm无法识
    1.安装selenium的方法(1)找到存放selenium目录的文件夹,右击“在终端中打开”(2)在命令行中输入pipinstallseleniumXXX.whl(3)等待些许时间,等待到提示安装成功2在pycharm中创建项目能识别到安装到的包(1)点击file——》NewProject(2)勾选上Inherit globalsite-packag......
  • vue element-ui表格table 表格动态 添加行、删除行、添加列、删除列 自定义表头
       vuetable表格动态添加行、删除行、添加列、删除列自定义表头; 增加一行、删除一行、添加一列、删除一列;每行带输入框input代码1、HTML部分:<template><divclass="app-container"><el-table:data="tableData"borderstyle="width:600px;margin-top:2......
  • 【教程】vscode添加powershell7终端
    win10自带的powershell是1.0版本的,太老了,更换为powershell7后,在vscode的集成终端中没有显示本篇教程记录在vscode添加powershell7终端的过程打开vscode终端配置然后来到这个页面进行设置查看powershell7的安装位置,并关闭以管理员身份启动寻找下面的设置(找......
  • JAVA面试题:HashMap和HashTable的区别
    一、先说结论        HashMap和HashTable都是Map接口的实现类。HashMap采用数组、链表和红黑树的数据结构,非线性安全且无序,查找效率高,初始化默认容量为2^4,每次扩容为原来的2倍;而HashTable采用数组和链表的数据结构,线性安全,键值均不允许为null,默认初始大小......
  • Python Pandas 从使用第 3 部分 API 自动生成的 Excel 文件中读取不一致的日期格式
    我正在使用PDF4meAPI将PDF发票转换为Excel文件。API可以正确读取日期。但是,当我打开Excel文件时,日期显示不一致:某些日期以正确的格式(dd/mm/yyyy)显示,而其他日期以错误的mm/dd/yyyy格式显示。当该月的某天小于或等于12时,似乎会出现这种不一致。......
  • 有没有办法选择将数据框上传到 CSV 的哪个单元格/列,就像将数据抓取到 Excel 文件中一
    我有将网络数据抓取到Excel文件中的经验,并且我知道将数据复制到Excel电子表格中时,您可以选择将其复制到哪一列。(startcol=10如下面的代码片段所示)withpd.ExcelWriter("jockeyclub.xlsx",engine="openpyxl",mode='a',if_sheet_exists='overlay')aswriter:......
  • Winform小工具:.txt档转excel档
    privatevoidbt_txt_to_excel_Click(objectsender,EventArgse){FolderBrowserDialogfolderDialog=newFolderBrowserDialog();if(folderDialog.ShowDialog()==DialogResult.OK){string......
  • laravel: 指定redis缓存项的前缀
    一,laravel默认会为缓存项添加前缀:config/database.php中:'redis'=>['client'=>env('REDIS_CLIENT','phpredis'),'options'=>['cluster'=>env('REDIS_CLU......
  • 解决el-image预览总是从第一页开始问题
    <el-imagev-for="(image,index)inform.imgUrl":key="index":src="image"class="image":preview-src-list="privew......
  • laravel: 调试打印sql
    一,代码:<?phpnamespaceApp\Models;useIlluminate\Database\Eloquent\Factories\HasFactory;useIlluminate\Database\Eloquent\Model;useIlluminate\Support\Facades\DB;classReadLogModelextendsModel{useHasFactory;//定义关联的数据表......