Vue实现无限滚动加载更多内容(懒加载)或实现查看更多按钮

在Vue中实现无限滚动加载更多内容,通常可以使用vue-infinite-loading插件。以下是一个简单的例子:

1、首先,安装vue-infinite-loading:

npm install vue-infinite-loading --save

2、在Vue组件中使用它:

<template>
  <div>
    <ul>
      <li v-for="item in items" :key="item.id">{{ item.content }}</li>
    </ul>
    <infinite-loading @infinite="infiniteHandler">
      <div slot="no-more">没有更多内容了</div>
    </infinite-loading>
  </div>
</template>
 
<script>
import InfiniteLoading from 'vue-infinite-loading';
 
export default {
  components: {
    InfiniteLoading,
  },
  data() {
    return {
      items: [], // 列表内容
      page: 1, // 当前页数
      hasMore: true, // 是否还有更多内容
    };
  },
  methods: {
    // 无限滚动加载的处理函数
    infiniteHandler($state) {
      // 模拟异步获取数据
      setTimeout(() => {
        if (this.page > 3) {
          // 模拟没有更多内容了
          $state.complete();
          this.hasMore = false;
        } else {
          // 模拟获取新的内容
          const moreItems = []; // 假设这是从服务器获取的新内容
          this.items = this.items.concat(moreItems);
          $state.loaded(); // 告诉插件加载完毕
          this.page++;
        }
      }, 1000);
    },
  },
};
</script>

在这个例子中,infiniteHandler方法会在组件创建时由infinite-loading触发。当用户滚动到页面底部时,会调用这个方法。在这个方法中,我们模拟了异步获取新内容的过程,并通过 s t a t e . l o a d e d ( ) 通知 i n f i n i t e − l o a d i n g 加载完毕。如果没有更多内容可加载,则通过 state.loaded()通知infinite-loading加载完毕。如果没有更多内容可加载,则通过 state.loaded()通知infiniteloading加载完毕。如果没有更多内容可加载,则通过state.complete()告知插件不再需要加载,并显示slot="no-more"中的内容。

3、实现查看更多按钮

如果是要手动加载的,通过点击更多按钮加载,思路简单点:
标签一样使用v-for遍历。

 <li v-for="item in items" :key="item.id">{{ item.content }}</li>

查看更多按钮

<el-button class="button" type="primary" round @click="loadMore()"  :disabled="isDisabled">查看更多</el-button>

而更多按钮点击事件只需把内容数组与新内容数组进行拼接即可。

		methods:{
			loadMore(){
				this.items = this.items.concat(moreItems);
			}
		}
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现滚动到底部加载更多,可以借助 Vue 自带的 `scroll` 事件和一些计算属性。具体实现步骤如下: 1. 在需要滚动的容器上监听 `scroll` 事件。 ```html <template> <div ref="container" @scroll="handleScroll"> <!-- 列表内容 --> </div> </template> ``` 2. 在 `handleScroll` 方法中,判断容器滚动到了底部,如果是则触发加载更多的方法。 ```js methods: { handleScroll() { const container = this.$refs.container // 容器滚动到底部 if (container.scrollHeight - container.scrollTop === container.clientHeight) { this.loadMore() } }, loadMore() { // 加载更多数据 } } ``` 3. 计算当前是否有更多数据需要加载,用于显示加载更多按钮或者提示信息。 ```js computed: { hasMore() { return this.list.length < this.total } } ``` 4. 在模板中根据 `hasMore` 的值来显示加载更多按钮或者提示信息。 ```html <template> <div ref="container" @scroll="handleScroll"> <!-- 列表内容 --> <div v-if="hasMore" class="load-more" @click="loadMore">加载更多</div> <div v-else class="no-more">没有更多数据了</div> </div> </template> ``` 完整代码示例: ```html <template> <div ref="container" @scroll="handleScroll"> <ul> <li v-for="(item, index) in list" :key="index">{{ item }}</li> </ul> <div v-if="hasMore" class="load-more" @click="loadMore">加载更多</div> <div v-else class="no-more">没有更多数据了</div> </div> </template> <script> export default { data() { return { list: [], // 列表数据 total: 0, // 总共的数据量 pageSize: 10, // 每页数据量 currentPage: 1 // 当前页数 } }, computed: { hasMore() { return this.list.length < this.total } }, methods: { handleScroll() { const container = this.$refs.container // 容器滚动到底部 if (container.scrollHeight - container.scrollTop === container.clientHeight) { this.loadMore() } }, loadMore() { // 模拟加载更多数据 setTimeout(() => { const start = this.pageSize * (this.currentPage - 1) const end = start + this.pageSize this.list = this.list.concat(Array.from({ length: this.pageSize }).map((_, i) => `Item ${start + i + 1}`)) this.currentPage++ }, 500) } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值