【VUE】el-table表格 实现滚动到底部加载更多数据

废话不多说,直接上代码

<template></template>部分代码

html 复制代码
<!-- 表格 -->
<el-table
  id="mytable"
  v-loading="listLoading"
  highlight-current-row
  row-key="project_id"
  :data="tableData"
  border
  :reload="reload"
  ref="myTable"
  style="width: 100%"
  show-summary
  :summary-method="getSummaries1"
  :span-method="arraySpanMethod"
  height="calc(100vh - 275px)"
  :load-more-disabled="disabledLoad"
>
  <el-table-column
    type="index"
    label="序号"
    :row-style="rowstyles"
    align="center"
    :fixed="true"
    width="50"
  />
  <el-table-column
    label="项目名称"
    prop="project_name"
    :show-overflow-tooltip="true"
    align="left"
    :fixed="true"
    width="400"
  >
    <template slot-scope="{ row }">
      <span>{{ row.project_name }}</span>
    </template>
  </el-table-column>
  <el-table-column
    label="项目进度及百分比"
    prop="progress_percentage"
    align="center"
    width="180"
    :show-overflow-tooltip="true"
  >
    <template slot-scope="{ row }">
      <el-select
        v-if="LockStatus == 0 && row.is_my_project == 1"
        v-model.lazy="row.progress_percentage"
        style="width: 175px"
      >
        <el-option label="招标阶段10%" value="招标阶段10%"></el-option>
        <el-option label="合同签订并开工50%" value="合同签订并开工50%"></el-option>
        <el-option label="转运维100%" value="转运维100%"></el-option>
      </el-select>
      <span v-else>{{ row.progress_percentage }}</span>
    </template>
  </el-table-column>
  <el-table-column
    label="合同签订金额"
    prop="contract_signing_amount"
    align="center"
    width="100"
    :show-overflow-tooltip="true"
  >
    <template slot-scope="{ row }">
      <textarea
        v-if="LockStatus == 0 && row.is_my_project == 1"
        v-model.lazy="row.contract_signing_amount"
        rows="1"
        cols="30"
        style="width: 98px;border: none;resize: none;margin-top: 7px;text-align: center;"
        class="pass_input"
      />
      <span v-else>{{ row.contract_signing_amount }}</span>
    </template>
  </el-table-column>
  <el-table-column
    label="备注"
    prop="info"
    align="center"
    width="100"
    :show-overflow-tooltip="true"
  >
    <template slot-scope="{ row }">
      <textarea
        v-if="LockStatus == 0 && row.is_my_project == 1"
        v-model.lazy="row.info"
        rows="1"
        style="width: 98px;border: none;resize: none;margin-top: 7px;text-align: center;"
        class="pass_input"
      />
      <span v-else>{{ row.info }}</span>
    </template>
  </el-table-column>
  <el-table-column
    fixed="right"
    :label="'操作'"
    align="center"
    width="100"
  >
    <template #default="{ row }">
      <div
        class="table-btn-box"
        v-if="LockStatus == 0 && row.is_my_project == 1"
      >
        <el-button type="primary" @click="submitRow(row)">提交</el-button>
      </div>
    </template>
  </el-table-column>
  <div
    v-if="tableData.length >= 50"
    slot="append"
    style="margin-top: 10px;margin-bottom: 10px;text-align: center;font-size: 15px;">
      {{ content }}
  </div>
</el-table>

其他部分的代码

javascript 复制代码
data() {
  return {
    listLoading: false, // Loading状态
    tableData: [], // 表格展示数据
    allData: [], // 接口返回的所有表格数据
    currentPage: 1, // 第几页
    pageSize: 50, // 每页展示多少条
    reload: 0,
  }
},
mounted() {
  // 表格添加滚动事件
  this.$refs.myTable.bodyWrapper.addEventListener('scroll', this.handleScroll)
},
beforeDestroy() {
  // 销毁滚动事件
  this.$refs.myTable.bodyWrapper.removeEventListener('scroll', this.handleScroll)
},
watch: {
  allData: {
    deep: true,
    immediate: true,
    handler(newValue) {
      const currentPage = this.currentPage || 1
      const total = currentPage * this.pageSize
      this.tableData = newValue.slice(0, total)
    }
  },
  // 强制刷新变量
  reload() {
    this.total = this.allData.length
    this.currentPage = 0
    this.$refs.myTable.bodyWrapper.scrollTop = 0
    this.fetchData()
    this.loop()
  }
},
methods: {
  // 滚动加载下一页,将下一页数据和之前数据进行累加
  handleScroll(event) {
    const { scrollTop, scrollHeight, clientHeight } = event.target
    if (Math.ceil(scrollTop) + clientHeight >= scrollHeight) {
      // 如果数据已全部加载,则跳出
      if (this.tableData.length == this.total) {
        return
      }
      this.fetchData()
    }
  },
  fetchData() {
    this.currentPage += 1
    const start = (this.currentPage - 1) * this.pageSize
    const end = start + this.pageSize
    const newData = this.allData.slice(start, end)
    this.tableData =
      this.currentPage == 1 ? newData : this.tableData.concat(newData)
  },
  // 如果滚动高度小于可视范围高度,则继续加载下一页,直至可视区域填充满
  loop() {
    this.$nextTick(() => {
      const { scrollHeight, clientHeight } = this.$refs.myTable.bodyWrapper
      if (scrollHeight && clientHeight && scrollHeight <= clientHeight) {
        if (this.tableData.length == this.total) {
          return         
        }
        this.fetchData()
        this.loop()
      }
    })
  },
},
相关推荐
竹林8183 小时前
用 wagmi v2 + viem 监听链上事件,我踩了三天坑终于搞懂了实时日志与历史补全
javascript
Momo__3 小时前
VueUse createReusableTemplate —— 单文件组件内的模板复用神器
前端·vue.js
只一3 小时前
😭从回调地狱到 async/await:一文打通 Ajax 与 JS 异步编程
javascript
程序员小富3 小时前
我开源了一个开发者专属的智能 JSON 工具,得到了媳妇高度认可
前端·vue.js·后端
小小小小宇3 小时前
程序员如何给 LLM 装工具以及看懂推理过程
前端
写代码的皮筏艇3 小时前
React中的forwardRef
前端·react.js·面试
槑有老呆4 小时前
花三个月工资请了个 AI 程序员,结果它连青岛啤酒股价都查不了
前端
风骏时光牛马4 小时前
Verilog开发常见问题汇总解析
前端
子兮曰4 小时前
AI Coding Method Map:一张图看懂 AI 编程的完整链路
前端·人工智能·后端