当前位置:   article > 正文

vue3实现容器内容滚动到底,触底加载新数据_vue3 获取滚动触底事件

vue3 获取滚动触底事件

scroll方式实现 

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

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

  1. <template>
  2. <div class="container" ref="container" @scroll="handleScroll">
  3. <ul>
  4. <li v-for="item in items" :key="item.id">{{ item.title }}</li>
  5. <li v-if="loading">Loading...</li>
  6. </ul>
  7. </div>
  8. </template>
  9. <script>
  10. import { ref, onMounted } from 'vue'
  11. export default {
  12. setup() {
  13. const containerRef = ref(null)
  14. const items = ref([])
  15. const loading = ref(false)
  16. const page = ref(1)
  17. const handleScroll = () => {
  18. const container = containerRef.value
  19. if (container.scrollTop + container.clientHeight >= container.scrollHeight) {
  20. loadMore()
  21. console.log('到底了');
  22. }
  23. }
  24. const loadMore = () => {
  25. if (loading.value) return
  26. loading.value = true
  27. // 发送请求加载新数据
  28. fetchData(page.value)
  29. .then(newData => {
  30. items.value = [...items.value, ...newData]
  31. loading.value = false
  32. page.value++
  33. })
  34. }
  35. onMounted(() => {
  36. // 初始化加载数据
  37. loadMore()
  38. })
  39. return {
  40. containerRef,
  41. items,
  42. loading,
  43. handleScroll
  44. }
  45. }
  46. }
  47. </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组件。

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

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

  1. import axios from 'axios';
  2. export default {
  3. data() {
  4. return {
  5. items: [],
  6. page: 1, // 当前页码
  7. limit: 10, // 每页数据量
  8. };
  9. },
  10. methods: {
  11. async loadMore($state) {
  12. const res = await axios.get(`/api/data?page=${this.page}&limit=${this.limit}`);
  13. this.items.push(...res.data);
  14. this.page++;
  15. $state.loaded(); // 通知插件已加载完成
  16. },
  17. },
  18. mounted() {
  19. // 监听滚动事件,当滚动到底部时触发加载更多数据
  20. this.$refs.container.addEventListener('scroll', () => {
  21. if (this.$refs.container.scrollTop + this.$refs.container.clientHeight === this.$refs.container.scrollHeight) {
  22. this.$refs.infiniteLoading.$emit('$InfiniteLoading:infinite');
  23. }
  24. });
  25. },
  26. };

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/698573
推荐阅读
相关标签
  

闽ICP备14008679号