vue3 ---- element-plus el-table+el-table-infinite-scroll 实现大数据量滚动-渲染加载-触底加载table 组件化

效果:这里总共24条数据 分10个10个的触底渲染:可以看到滚动条一开始很长 触底之后滚动条就变短了
在这里插入图片描述
这里使用的插件是:el-table-infinite-scroll
这里我用的是vue3的版本:

    "el-table-infinite-scroll": "^3.0.6",

其他相关配置请移步此插件官网查看详细信息:
//main.js文件配置

// el-table 滚动
import ElTableInfiniteScroll from "el-table-infinite-scroll";


app.use(ElTableInfiniteScroll)

.vue代码

<template>
  <div class="result-table">
    <el-table
      v-el-table-infinite-scroll="loadData"
      v-loading="loading"
      element-loading-background="rgba(0, 0, 0, 0.2)"
      :data="tableData"
      :height="height"
    >
      <el-table-column
        v-if="indexShow"
        type="index"
        align="center"
        label="序号"
        width="60px"
      ></el-table-column>
      <el-table-column
        :show-overflow-tooltip="item.tooltip ? item.tooltip : false"
        :align="item.align ? item.align : 'center'"
        :label="item.label"
        :width="item.width"
        :prop="item.key"
        v-for="(item, index) in tableHeader"
        :key="index"
      >
        <template v-slot="scope" v-if="item.slot">
          <slot :name="item.slot" :row="scope.row" />
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script setup>
import { watch } from "vue";
const props = defineProps({
  tbHeader: {
    type: Array,
    required: false,
  },
  tbData: {
    type: Array,
    required: false,
  },
  height: {
    type: String,
    required: false,
  },
  indexShow: {
    type: Boolean,
    default: true,
  },
});
let loading = ref(false);
let height = props.height;
let tableHeader = props.tbHeader;
let tableData = ref([]);
tableData.value = props.tbData;
let allTableData = ref([]);
watch(
  () => props.tbData,
  (val) => {
    // 初始加载10条
    if (val.length >= 10) {
      allTableData.value = JSON.parse(JSON.stringify(val));
      tableData.value = val.slice(0, 10);
    } else {
      tableData.value = val;
    }
  },
  { deep: true }
);
let index = ref(0);
function loadData() {
  // 触底加载剩下的n-10条
  let newTableData = allTableData.value.slice(
    index.value * 10,
    index.value * 10 + 9
  );
  tableData.value = tableData.value.concat(newTableData);
  index.value++
}
</script>

<style lang="scss" scoped>
.result-table {
  ::v-deep {
    .el-table {
      color: #ffffff;
      background-color: transparent !important;
    }

    .el-table tr {
      background: rgba(27, 60, 104, 0.2) !important;
    }

    // .el-table tr:nth-child(2n) {
    //   background: rgba(33, 78, 137, 0.3) !important;
    // }

    .el-table th.el-table__cell {
      font-size: 16px;
      font-weight: 600;
      color: #fff;
      background: rgba(27, 60, 104, 1) !important;
      border-bottom: none !important;
    }

    .el-table td.el-table__cell {
      font-size: 16px;
      color: #fff;
      border-bottom: none !important;
    }

    .el-table tr:hover td.el-table__cell {
      border-bottom: none !important;
      color: #00aefb;
      background: rgba(32, 57, 94, 0.5) !important;
    }

    .el-table--border .el-table__inner-wrapper::after,
    .el-table--border::after,
    .el-table--border::before,
    .el-table__inner-wrapper::before {
      display: none;
    }
  }
}
</style>

使用:

        <LyTable :tbData="tbData" :tbHeader="tbHeader" :height="height">
          <template v-slot:operate="data">
            <div class="l-flex1 l-jc-c">
              <img
                src="@/assets/images/yjzy/position.png"
                class="position l-cur"
                alt=""
              />
            </div>
          </template>
        </LyTable>




let tbHeader = ref([
  {
    key: "eventTitle",
    label: "事件名称",
    width: "280",
    tooltip: true,
  },
  {
    key: "eventLevel",
    label: "事件等级",
    width: "",
    slot: "level",
  },
  {
    key: "occurrenceTime",
    label: "发生时间",
    width: "200",
  },
  {
    key: "dealState",
    label: "处置状态",
    width: "",
    slot: "typeBtn",
  },
  {
    key: "operate",
    label: "操作",
    width: "",
    slot: "operate",
  },
]);
let height = ref("321px");
let tbData = ref([
  {
    eventTitle: "突发事件",
    occurrenceTime: "2024-12-20 14:35:50",
    eventLevel: "1",
    dealState: "1",
  }
]);
### 解决 `el-table-infinite-scroll` 无法引入的问题 #### 局部引入方式 对于局部引入的情况,确保在组件内部正确注册指令。如果遇到无法引入的问题,可能是由于语法错误或是路径不正确引起的。 ```javascript <script> import elTableInfiniteScroll from &#39;el-table-infinite-scroll&#39;; export default { directives: { &#39;el-table-infinite-scroll&#39;: elTableInfiniteScroll }, }; </script> ``` 上述代码展示了如何在一个特定的Vue组件内局部导入并应用该插件[^1]。 #### 全局引入方法 当采用全局引入的方式时,则需确认是否已经在项目的入口文件(main.js)里进行了正确的安装操作: ```javascript // main.js import Vue from &#39;vue&#39;; import ElTableInfiniteScroll from &#39;el-table-infinite-scroll&#39;; Vue.use(ElTableInfiniteScroll); ``` 此段脚本用于在整个应用程序范围内使能无限滚动功能[^3]。 #### 常见问题排查 - **版本兼容性** 如果使用的 Element UI 或者 Element Plus 版本较新而插件版本较低的话可能会引发冲突。建议查看官方文档获取最新版次的信息,并保持两者之间的良好匹配度。 - **依赖项缺失** 确认已经成功安装了必要的 npm/yarn 包。可以通过命令行工具执行如下命令来添加缺少的部分: ```bash npm install el-table-infinite-scroll --save ``` 或者如果是使用 yarn 的话, ```bash yarn add el-table-infinite-scroll ``` - **浏览器控制台报错信息** 查看开发者工具中的 Console 面板是否有任何提示性的警告或错误消息可以帮助定位具体原因所在。 - **Node Modules 清理重试** 尝试删除 node_modules 文件夹以及 package-lock.json (npm) / yarn.lock (yarn),之后重新运行 `npm install` 或 `yarn` 来重建整个依赖树结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值