当前位置:首页 > VUE

vue表格实现自动加载

2026-01-20 22:19:54VUE

Vue 表格自动加载实现方法

监听滚动事件实现自动加载

通过监听表格容器的滚动事件,判断是否滚动到底部触发加载更多数据。适用于固定高度的表格容器。

<template>
  <div class="table-container" @scroll="handleScroll">
    <table>
      <!-- 表格内容 -->
    </table>
    <div v-if="loading">加载中...</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      loading: false,
      page: 1,
      total: 0,
      list: []
    }
  },
  methods: {
    handleScroll(e) {
      const container = e.target
      const scrollBottom = container.scrollHeight - container.scrollTop - container.clientHeight
      if (scrollBottom < 50 && !this.loading && this.list.length < this.total) {
        this.loadMore()
      }
    },
    loadMore() {
      this.loading = true
      this.page++
      // 调用API获取数据
      fetchData(this.page).then(res => {
        this.list = [...this.list, ...res.data]
        this.total = res.total
        this.loading = false
      })
    }
  }
}
</script>

<style>
.table-container {
  height: 500px;
  overflow-y: auto;
}
</style>

使用 Intersection Observer API

利用现代浏览器支持的Intersection Observer API检测元素是否进入视口,实现更高效的自动加载。

<template>
  <div>
    <table>
      <!-- 表格内容 -->
    </table>
    <div ref="loader" v-if="hasMore">
      <span v-if="loading">加载中...</span>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      loading: false,
      hasMore: true,
      page: 1,
      list: []
    }
  },
  mounted() {
    this.initObserver()
  },
  methods: {
    initObserver() {
      const observer = new IntersectionObserver((entries) => {
        if (entries[0].isIntersecting && !this.loading && this.hasMore) {
          this.loadMore()
        }
      })
      observer.observe(this.$refs.loader)
    },
    loadMore() {
      this.loading = true
      this.page++
      fetchData(this.page).then(res => {
        this.list = [...this.list, ...res.data]
        this.hasMore = res.hasMore
        this.loading = false
      })
    }
  }
}
</script>

使用第三方库实现

对于复杂场景,可以考虑使用现成的无限滚动库如vue-infinite-loading,简化开发流程。

安装依赖:

npm install vue-infinite-loading

使用示例:

<template>
  <div>
    <table>
      <!-- 表格内容 -->
    </table>
    <infinite-loading @infinite="loadMore">
      <div slot="spinner">加载中...</div>
      <div slot="no-more">没有更多数据了</div>
    </infinite-loading>
  </div>
</template>

<script>
import InfiniteLoading from 'vue-infinite-loading'

export default {
  components: { InfiniteLoading },
  data() {
    return {
      page: 1,
      list: []
    }
  },
  methods: {
    loadMore($state) {
      fetchData(this.page).then(res => {
        if (res.data.length) {
          this.list = [...this.list, ...res.data]
          this.page++
          $state.loaded()
        } else {
          $state.complete()
        }
      })
    }
  }
}
</script>

优化性能的注意事项

vue表格实现自动加载

  1. 合理设置节流阀,避免滚动事件频繁触发
  2. 及时清理不再需要的观察者,防止内存泄漏
  3. 在组件销毁时移除事件监听器
  4. 考虑添加防抖机制,优化高频触发场景
  5. 对于大数据量表格,建议实现虚拟滚动技术

以上方法可根据具体项目需求选择使用,现代浏览器环境下推荐优先考虑Intersection Observer方案,兼容性要求高的项目可选择传统滚动监听方式。

分享给朋友:

相关文章

vue实现子表格

vue实现子表格

Vue 实现子表格的方法 在 Vue 中实现子表格可以通过多种方式完成,以下是几种常见的方法: 使用嵌套组件 创建一个父表格组件和一个子表格组件,通过 props 将数据传递给子表格组件。父表格的每…

vue实现表格拖动列宽

vue实现表格拖动列宽

实现表格列宽拖动的核心思路 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽逻辑,动态修改列宽。需要处理表头与表体的联动,确保拖动时视觉一致。 基础HTML结构 &…

vue实现子表格

vue实现子表格

实现子表格的基本思路 在Vue中实现子表格通常需要结合组件化思想和动态渲染技术。常见的场景是在主表格的行内嵌套子表格,展开主表行时显示对应的子表数据。 使用el-table实现子表格(Element…

css制作表格

css制作表格

CSS 制作表格的方法 使用 CSS 可以灵活地创建和样式化表格,以下是几种常见的方法: 使用 HTML 表格标签结合 CSS 样式 通过 HTML 的 <table>、<tr&g…

vue实现简单表格

vue实现简单表格

使用 Vue 实现简单表格 Vue 提供了多种方式实现表格功能,以下是基于 Vue 3 的两种常见方法: 基础表格实现 通过 v-for 指令循环渲染表格数据: <template&…

vue实现表格修改

vue实现表格修改

Vue 实现表格修改的方法 使用 v-model 绑定数据 在 Vue 中可以通过 v-model 实现双向数据绑定,适用于表格单元格的编辑。 为表格的每个单元格绑定 v-model,动态修改数据。…