赞
踩
在Vue3中,可以使用ref
和onMounted
钩子函数获取容器元素并监听滚动事件,判断内容是否滚动到了底部,从而触发加载新数据。
以下是一个简单的示例代码:
- <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
函数是滚动事件的处理函数,首先获取容器元素,然后通过判断scrollTop
和clientHeight
是否等于scrollHeight
来判断内容是否滚动到了底部,如果是则触发loadMore
加载新数据。
loadMore
函数首先判断是否正在加载数据,如果是则直接返回,否则设置loading
为true
,然后发送请求加载新数据,将新数据和旧数据拼接起来,更新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()
方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。