vue3实现滚动到底加载新数据-触底加载数据_数据

在Vue3中,可以通过监听元素的滚动事件,获取元素的scrollTop、clientHeight和scrollHeight属性来判断是否滚动到底部。

具体实现步骤如下:

  1. 给需要滚动的元素绑定滚动事件,通过ref获取元素以便使用。
<template>
  <div ref="scrollWrapper" @scroll="handleScroll">
    <!-- 显示数据的容器 -->
    <div class="list">
      <!-- 数据项 -->
      <div v-for="item in list" :key="item.id">{{ item.text }}</div>
    </div>
  </div>
</template>

<script>
export default {
  setup() {
    const scrollWrapperRef = ref(null) // 获取滚动容器的ref

    const handleScroll = () => {
      const scrollWrapper = scrollWrapperRef.value // 获取滚动容器
      const { scrollTop, clientHeight, scrollHeight } = scrollWrapper // 获取滚动数据

      // 判断是否滚动到底部
      if (scrollTop + clientHeight >= scrollHeight - 10) {
        // 滚动到底部时触发加载数据的函数
        loadMoreData()
      }
    }

    return {
      scrollWrapperRef,
      handleScroll,
    }
  },
}
</script>
  1. 在loadMoreData函数中加载新数据并更新列表。
<script>
export default {
  setup() {
    // 省略代码...

    const loadMoreData = () => {
      // 加载新数据
      fetchData().then((res) => {
        // 更新列表
        const newList = [...list, ...res.data]
        list.value = newList
      })
    }

    return {
      scrollWrapperRef,
      handleScroll,
      loadMoreData,
    }
  },
}
</script>

注:fetchData()是获取新数据的异步请求函数,res.data是获取到的新数据数组。更新列表时使用Vue3新增的响应式数据类型ref,可以通过赋值的方式直接更新数据,不需要手动调用setState等方法。

  1. 在组件挂载时加载初始数据。
<script>
export default {
  setup() {
    // 省略代码...

    onMounted(() => {
      // 组件挂载时加载初始数据
      fetchData().then((res) => {
        list.value = res.data
      })
    })

    return {
      scrollWrapperRef,
      handleScroll,
      loadMoreData,
    }
  },
}
</script>

完整代码如下:

<template>
  <div ref="scrollWrapper" @scroll="handleScroll">
    <!-- 显示数据的容器 -->
    <div class="list">
      <!-- 数据项 -->
      <div v-for="item in list" :key="item.id">{{ item.text }}</div>
    </div>
  </div>
</template>

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

export default {
  setup() {
    const list = ref([])
    const scrollWrapperRef = ref(null) // 获取滚动容器的ref

    const handleScroll = () => {
      const scrollWrapper = scrollWrapperRef.value // 获取滚动容器
      const { scrollTop, clientHeight, scrollHeight } = scrollWrapper // 获取滚动数据

      // 判断是否滚动到底部
      if (scrollTop + clientHeight >= scrollHeight - 10) {
        // 滚动到底部时触发加载数据的函数
        loadMoreData()
      }
    }

    const fetchData = () => {
      // 模拟获取数据的异步请求
      return new Promise((resolve) => {
        setTimeout(() => {
          const newData = Array.from({ length: 10 }).map((_, index) => ({
            id: list.value.length + index,
            text: `item ${list.value.length + index}`,
          }))
          resolve({ data: newData })
        }, 1000)
      })
    }

    const loadMoreData = () => {
      // 加载新数据
      fetchData().then((res) => {
        // 更新列表
        const newList = [...list, ...res.data]
        list.value = newList
      })
    }

    onMounted(() => {
      // 组件挂载时加载初始数据
      fetchData().then((res) => {
        list.value = res.data
      })
    })

    return {
      list,
      scrollWrapperRef,
      handleScroll,
      loadMoreData,
    }
  },
}
</script>

以上就是Vue3实现滚动到底加载新数据的方法,希望对你有所帮助。


在 Vue 3 中,你可以使用 @scroll 事件和 Intersection Observer API 来实现滚动到底部加载新数据的功能。

首先,在你的组件中,添加一个容器元素,用来监听滚动事件:

<template>
  <div class="container" @scroll="handleScroll">
    <!-- 渲染数据 -->
  </div>
</template>

接下来,在组件的 data 中定义一个变量来表示是否已经到达底部

<script>
export default {
  data() {
    return {
      reachedBottom: false
    };
  },
  methods: {
    handleScroll() {
      const container = this.$el.querySelector('.container');
      if (container.scrollHeight - container.scrollTop === container.clientHeight) {
        this.reachedBottom = true;
      } else {
        this.reachedBottom = false;
      }
    }
  }
};
</script>

在 handleScroll 方法中,我们通过计算容器的滚动高度、滚动位置和可见区域的高度来判断是否已经滚动到底部。当滚动到底部时,将 reachedBottom 设置为 true

最后,在模板中根据 reachedBottom 的值来触发加载新数据的逻辑:

<template>
  <div class="container" @scroll="handleScroll">
    <!-- 渲染数据 -->
    <button v-if="reachedBottom" @click="loadMoreData">加载更多</button>
  </div>
</template>

在上面的示例中,我们在滚动到底部时显示一个 "加载更多" 的按钮,并绑定 loadMoreData 方法来处理加载新数据的逻辑。