当前位置:   article > 正文

Vue3 实现滚动加载更多_vue3 如何实现滚动加载

vue3 如何实现滚动加载

简介

随着移动设备的普及,滚动加载更多已经成为了一个常见的交互方式,用户可以在滚动页面时自动加载更多的数据,这种方式避免了翻页和点击“加载更多”按钮的繁琐操作,提高了用户体验。

本文将介绍如何使用 Vue3 实现滚动加载更多功能,同时提供 mock 数据,方便读者在本地调试。

准备工作

在开始之前,我们需要安装 Vue3 和 Axios,可以使用以下命令进行安装:

npm install vue@next axios

创建组件

我们将创建一个名为 InfiniteScroll 的组件,该组件将显示一些数据,并在滚动到底部时自动加载更多数据。

首先,我们需要引入 defineComponent 和 ref 函数:

import { defineComponent, ref } from 'vue'

然后,我们需要定义一些数据和方法,包括当前的页码、每页显示的数量、数据列表和是否正在加载:

  1. export default defineComponent({
  2. setup() {
  3. const currentPage = ref(1) // 当前页码
  4. const pageSize = 10 // 每页数量
  5. const list = ref([]) // 数据列表
  6. const loading = ref(false) // 是否正在加载
  7. const loadData = () => {
  8. // 加载数据
  9. }
  10. return {
  11. currentPage,
  12. pageSize,
  13. list,
  14. loading,
  15. loadData
  16. }
  17. }
  18. })

接下来,我们需要在组件的模板中显示数据,并监听滚动事件:

<template>  <div class="infinite-scroll">    <ul>      <li v-for="item in list" :key="item.id">{{ item.title }}</li>    </ul>    <div v-if="loading">正在加载中...</div>  </div></template>
<script>import { defineComponent, ref } from 'vue'
export default defineComponent({  setup() {    const currentPage = ref(1)    const pageSize = 10    const list = ref([])    const loading = ref(false)
    const loadData = () => {      // 加载数据    }
    const handleScroll = () => {      // 监听滚动事件    }
    return {      currentPage,      pageSize,      list,      loading,      loadData,      handleScroll    }  }})</script>

在 handleScroll 方法中,我们需要判断是否滚动到了底部,如果滚动到了底部,就调用 loadData 方法加载更多数据。

加载数据

在 loadData 方法中,我们需要使用 Axios 发送请求获取数据,并将数据添加到列表中。

为了方便调试,我们提供了一个 mock 接口,可以使用以下代码获取数据:​​​​​​​

const loadData = async () => {  loading.value = true // 开始加载数据  const response = await axios.get(`https://jsonplaceholder.typicode.com/posts?_page=${currentPage.value}&_limit=${pageSize}`)  list.value = [...list.value, ...response.data] // 将数据添加到列表中  currentPage.value++ // 增加页码  loading.value = false // 加载完成}

监听滚动事件

在 handleScroll 方法中,我们需要获取滚动容器的高度和滚动高度,以及内容的高度,然后判断是否滚动到了底部。​​​​​​​

const handleScroll = () => {  const container = document.querySelector('.infinite-scroll') // 获取滚动容器  const { scrollTop, scrollHeight, clientHeight } = container // 获取滚动高度和内容高度  if (scrollTop + clientHeight >= scrollHeight && !loading.value) {    loadData() // 滚动到底部,加载更多数据  }}

最后,我们需要在组件的 mounted 生命周期中添加滚动事件监听器:​​​​​​​

export default defineComponent({  setup() {    // ...
    onMounted(() => {      window.addEventListener('scroll', handleScroll)    })
    onUnmounted(() => {      window.removeEventListener('scroll', handleScroll)    })
    return {      // ...    }  }})

完整代码​​​​​​​

<template>  <div class="infinite-scroll">    <ul>      <li v-for="item in list" :key="item.id">{{ item.title }}</li>    </ul>    <div v-if="loading">正在加载中...</div>  </div></template>
<script>import { defineComponent, ref, onMounted, onUnmounted } from 'vue'import axios from 'axios'
export default defineComponent({  setup() {    const currentPage = ref(1)    const pageSize = 10    const list = ref([])    const loading = ref(false)
    const loadData = async () => {      loading.value = true      const response = await axios.get(`https://jsonplaceholder.typicode.com/posts?_page=${currentPage.value}&_limit=${pageSize}`)      list.value = [...list.value, ...response.data]      currentPage.value++      loading.value = false    }
    const handleScroll = () => {      const container = document.querySelector('.infinite-scroll')      const { scrollTop, scrollHeight, clientHeight } = container      if (scrollTop + clientHeight >= scrollHeight && !loading.value) {        loadData()      }    }
    onMounted(() => {      window.addEventListener('scroll', handleScroll)    })
    onUnmounted(() => {      window.removeEventListener('scroll', handleScroll)    })
    return {      currentPage,      pageSize,      list,      loading,      loadData    }  }})</script>

结语

本文介绍了如何使用 Vue3 实现滚动加载更多功能,包括创建组件、加载数据和监听滚动事件等。希望本文能够帮助读者更好地理解 Vue3 中的 setup 语法糖,并在实际项目中应用。

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

闽ICP备14008679号