element Plus实现table无限滚动

因为element Plus和element UI目前都不支持表格的无限下拉滚动,所以如果想要实现,就需要自己去写自定义指令来实现,在功能实现的探索过程中,我也尝试了使用引入插件来实现,但是发现目前针对elemtnt Plus来实现的插件似乎还没有

以下是实现的具体代码:

在table中添加自定义指令

<el-table
  v-loadMore.expand="{func: loadmore, target: '.el-scrollbar__wrap', delay: 300}"
  :load-more-disabled="false"
></el-table>
<script lang="ts" setup>
	const loadmore = () => {}
</script>

添加自定义指令directive文件

import type { Directive, App } from 'vue';

const debounce = function (func: any, delay: any) {
  let timer: any = null
  return function () {
    if (timer) clearTimeout(timer)
    timer = null
    let self = this
    let args = arguments
    timer = setTimeout(() => {
        func.apply(self, args)
    }, delay)
  }
}

const loadMore: Directive = {
  mounted (el: any, binding: any, vnode: any) {
    const { expand } = binding.modifiers
    // 使用更丰富的功能,支持父组件的指令作用在指定的子组件上
    if (expand) {
      /**
       * target 目标DOM节点的类名
       * distance 减少触发加载的距离阈值,单位为px
       * func 触发的方法
       * delay 防抖时延,单位为ms
       * load-more-disabled 是否禁用无限加载
       */
      let { target, distance = 0, func, delay = 200 } = binding.value
      if (typeof target !== 'string') return
      let targetEl = el.querySelector(target)
      if (!targetEl) {
        console.log('找不到容器')
        return
      }
      binding.handler = function () {
        const { scrollTop, scrollHeight, clientHeight } = targetEl
        
        let disabled = el.getAttribute('load-more-disabled')
        disabled = vnode[disabled] || disabled
        if (scrollHeight <= scrollTop + clientHeight + distance) {
          if (disabled == 'true') return
          func && func()
        }
      }
      targetEl.addEventListener('scroll', binding.handler)
    } else {
      binding.handler = debounce(function () {
        const { scrollTop, scrollHeight, clientHeight }  = el
        if (scrollHeight === scrollTop + clientHeight) {
            binding.value && binding.value()
        }
      }, 200)
      el.addEventListener('scroll', binding.handler)
    }
  },
  unmounted (el: any, binding: any) {
    let { arg } = binding
    // 使用更丰富的功能,支持父组件的指令作用在指定的子组件上
    if (arg === 'expand') {
        /**
         * target 目标DOM节点的类名
         * offset 触发加载的距离阈值,单位为px
         * method 触发的方法
         * delay 防抖时延,单位为ms
         */
        const { target } = binding.value
        if (typeof target !== 'string') return
        let targetEl = el.querySelector(target)
        targetEl && targetEl.removeEventListener('scroll', binding.handler)
        targetEl = null
    } else {
        el.removeEventListener('scroll', binding.handler)
        el = null
    }
  }
};

export function setupLoadMoreDirective(app: App) {
  app.directive('loadMore', loadMore);
}

export default loadMore;

directive文件夹下的index文件引入

import type { App } from 'vue';
import { setupLoadMoreDirective } from './loadMore';

export function setupGlobDirectives(app: App) {
  setupLoadMoreDirective(app)
}

main.ts文件全局初始化

import { setupGlobDirectives } from '@/directives';
function init(){
  const app = createApp(App);
  setupGlobDirectives(app);
}
init()

完成

参考文档: element-ui的el-table表格实现无限滚动,使用自带的infinite-scroll

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Element UI 的 el-table 组件默认不支持无限滚动,需要通过自定义 slot 和监听 scroll 事件来实现。 以下是一个简单的例子: ```html <template> <div class="table-wrap" ref="tableWrap" @scroll="handleScroll"> <el-table :data="tableData" v-loading="loading" border> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="age" label="Age"></el-table-column> <el-table-column prop="address" label="Address"></el-table-column> </el-table> <div v-if="showLoading" class="loading"> <i class="el-icon-loading"></i> </div> </div> </template> <script> export default { data() { return { tableData: [], loading: false, showLoading: false, page: 1, pageSize: 10, total: 0, }; }, created() { this.loadData(); }, methods: { loadData() { this.loading = true; // 模拟异步加载数据 setTimeout(() => { const data = []; for (let i = 0; i < this.pageSize; i++) { data.push({ name: `Name${this.total + i + 1}`, age: Math.floor(Math.random() * 100) + 1, address: `Address${this.total + i + 1}`, }); } this.tableData = this.tableData.concat(data); this.total += data.length; this.loading = false; }, 1000); }, handleScroll() { const tableWrap = this.$refs.tableWrap; const scrollTop = tableWrap.scrollTop; const scrollHeight = tableWrap.scrollHeight; const clientHeight = tableWrap.clientHeight; if (scrollTop + clientHeight >= scrollHeight && !this.loading) { // 滚动到底部且未加载中,则加载下一页数据 this.showLoading = true; this.page++; this.loadData(); } }, }, }; </script> ``` 在模板中,我们需要将 el-table 放在一个具有固定高度和滚动条的容器内,用 ref 属性获取容器元素并监听 scroll 事件,当滚动到底部时触发加载下一页数据的操作。 在 data 中定义了一些状态,包括表格数据、加载状态、当前页数、每页数量和数据总数等。loadData 方法用于模拟异步加载数据,并将加载到的数据追加到表格数据中。handleScroll 方法用于监听 scroll 事件,当滚动到底部时触发加载下一页数据的操作。 在模板中,我们还需要添加一个 loading 组件,用于显示加载中状态。根据 showLoading 变量的值决定是否显示 loading 组件。 需要注意的是,el-table 组件的高度必须要设置,否则无法触发滚动事件。可以通过在 el-table 上添加 height 属性或者在外层容器上设置固定高度来实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值