vue3实现容器内容滚动到底,触底加载新数据

本文介绍在Vue3中实现容器内容滚动到底部自动加载新数据的两种方式。一是scroll方式,利用钩子函数获取容器元素、监听滚动事件判断是否到底部来加载新数据;二是组件方式,通过安装插件、添加组件和加载数据方法实现,加载完成需手动通知插件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scroll方式实现 

在Vue3中,可以使用refonMounted钩子函数获取容器元素并监听滚动事件,判断内容是否滚动到了底部,从而触发加载新数据。

以下是一个简单的示例代码:

<template>
  <div class="container" ref="container" @scroll="handleScroll">
    <ul>
      <li v-for="item in items" :key="item.id">{{ item.title }}</li>
      <li v-if="loading">Loading...</li>
    </ul>
  </div>
</template>

<script>
import { ref, onMounted } from 'vue'

export default {
  setup() {
    const containerRef = ref(null)
    const items = ref([])
    const loading = ref(false)
    const page = ref(1)

    const handleScroll = () => {
      const container = containerRef.value
      if (container.scrollTop + container.clientHeight >= container.scrollHeight) {
        loadMore()
        console.log('到底了');
      }
    }

    const loadMore = () => {
      if (loading.value) return
      loading.value = true
      // 发送请求加载新数据
      fetchData(page.value)
        .then(newData => {
          items.value = [...items.value, ...newData]
          loading.value = false
          page.value++
        })
    }

    onMounted(() => {
      // 初始化加载数据
      loadMore()
    })

    return {
      containerRef,
      items,
      loading,
      handleScroll
    }
  }
}
</script>

在上面的示例中,containerRef使用ref获取了容器元素,items使用ref定义了列表数据,loading表示是否正在加载新数据,page表示当前页码数。

handleScroll函数是滚动事件的处理函数,首先获取容器元素,然后通过判断scrollTopclientHeight是否等于scrollHeight来判断内容是否滚动到了底部,如果是则触发loadMore加载新数据。

loadMore函数首先判断是否正在加载数据,如果是则直接返回,否则设置loadingtrue,然后发送请求加载新数据,将新数据和旧数据拼接起来,更新items,将loading设置为false,增加page的值。

最后,在onMounted钩子函数中初始化加载数据。


组件方式

可以使用vue-infinite-loading插件来实现容器内容滚动到底部时自动加载新数据。

步骤如下:

安装vue-infinite-loading插件,并将其引入到你的Vue项目中。

npm install vue-infinite-loading
import InfiniteLoading from 'vue-infinite-loading';

在需要实现滚动加载的容器内添加infinite-loading组件。

<template>
  <div class="container" ref="container">
    <div v-for="(item, index) in items" :key="index">{{ item }}</div>
    <infinite-loading @infinite="loadMore" />
  </div>
</template>

在容器所在的组件中添加loadMore方法,用于加载新数据。

import axios from 'axios';

export default {
  data() {
    return {
      items: [],
      page: 1, // 当前页码
      limit: 10, // 每页数据量
    };
  },
  methods: {
    async loadMore($state) {
      const res = await axios.get(`/api/data?page=${this.page}&limit=${this.limit}`);
      this.items.push(...res.data);
      this.page++;
      $state.loaded(); // 通知插件已加载完成
    },
  },
  mounted() {
    // 监听滚动事件,当滚动到底部时触发加载更多数据
    this.$refs.container.addEventListener('scroll', () => {
      if (this.$refs.container.scrollTop + this.$refs.container.clientHeight === this.$refs.container.scrollHeight) {
        this.$refs.infiniteLoading.$emit('$InfiniteLoading:infinite');
      }
    });
  },
};

通过以上步骤,就可以实现容器内容滚动到底部时自动加载新数据了。当数据加载完成后,需要手动通知插件已完成加载,即调用$state.loaded()方法。

### 实现Vue.js项目中使用vue-pdf插件时触底加载更多PDF页 为了实现在页面滚动到底部时自动加载更多PDF页的功能,可以采用监听滚动事件的方法来检测是否到达底部,并在此基础上调用API获取新数据。具体来说,当用户浏览到文档接近末端时触发额外页面的加载。 #### HTML结构设置 首先定义用于展示PDF文件的基础容器: ```html <div id="app"> <div ref="pdfContainer" class="pdf-container"></div> </div> ``` #### JavaScript逻辑编写 接着在`<script>`标签内加入如下代码片段完成主要业务处理: ```javascript import PDFDocument from "vue-pdf"; export default { name: &#39;PdfViewer&#39;, components: { pdf: PDFDocument }, data() { return { currentPage: 1, // 当前显示第几页 totalPages: null, // 总共多少页 loading: false, intervalId: undefined } }, mounted(){ this.loadPage(); window.addEventListener(&#39;scroll&#39;, this.handleScroll); }, methods:{ async loadPage(){ if(this.loading || (this.currentPage >= this.totalPages)) return; try{ this.loading = true; let response = await fetch(`your_api_endpoint?page=${this.currentPage}`); let blob = await response.blob(); const url = URL.createObjectURL(blob); setTimeout(() => { var newElement = document.createElement("embed"); newElement.setAttribute("type", "application/pdf"); newElement.src = url; newElement.width = "80%"; newElement.height = "700px"; this.$refs.pdfContainer.appendChild(newElement); this.currentPage++; this.loading = false; }, 500); }catch(error){ console.error("Failed to load page:", error); this.loading = false; } }, handleScroll(event) { if(isScrollToBottom()){ this.loadPage(); } } }, beforeDestroy () { clearInterval(this.intervalId); window.removeEventListener(&#39;scroll&#39;, this.handleScroll); } } ``` 上述代码实现了基本的懒加载机制[^1]。每当浏览器窗口发生滚动变化时都会执行一次`handleScroll()`函数;如果满足条件,则会继续请求并渲染下一页的内容直到达到总页数为止。 注意这里引入了一个辅助判断是否滚至底部的小工具 `isScrollToBottom()` ,其定义方式已在提供的参考资料中有提及[^3]。 此外,在组件销毁之前移除了全局范围内的滚动监听器以防止内存泄漏等问题的发生。 #### CSS样式调整 最后给`.pdf-container`类名添加一些简单的CSS规则使其看起来更美观整齐: ```css .pdf-container { width: 90%; margin-left: auto; margin-right: auto; } /* 可选 */ .embed { border: solid 1px black; padding: .5em; display:block; margin-bottom:.5rem; } ``` 通过这种方式可以在Vue应用里轻松实现带有懒加载特性的PDF查看器了!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackieDYH

谢谢您嘞!我会继续加油地

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值