element plus Infinite Scroll 无限滚动

欢迎关注我的公众号:夜说猫,让一个贫穷的程序员不靠打代码也能吃饭~

零零糖公众号

element plus官网中,Infinite Scroll示例使用的是数字,在实际项目运用中,我们更多的是使用json数组进行渲染,所以我们改写v-infinite-scroll属性的load方法。

v-infinite-scroll在使用之前,有两点要注意

1、在加载页面的时候,element plus会根据容器的高度,自动调用v-infinite-scroll后面的方法,让数据自动填充整个容器。

所以你会发现,自己明明只默认两个或三个数据,但是数据总是填满了容器,出现了更多个数据。

2、要使用ref()方法赋值,成为一个响应式的变量,对这个变量进行修改节点才会响应变化。

如果没有使用ref()方法,数据不会实时监听。

以上两点,在官网都没有提到,至少在这个组件的介绍的页面没有提到。

是初学者容易遇到的坑。

修改示例代码,使用数组

<template>
<ul v-infinite-scroll="load" infinite-scroll-disabled="false" infinite-scroll-distance="1" class="infinite-list" style="overflow: auto">
    <!--<li v-for="i in count" :key="i" class="infinite-list-item">{{ i }}</li>-->
	<li v-for="item in list" :key="item.id" class="infinite-list-item">
	{{ item.id }}{{ item.title }}
	</li>
  </ul>
</template>


<script lang="ts" setup>
import { ref } from 'vue'

//瀑布流
//import { ref } from 'vue'
//const count = ref(0)
  const list=ref([]);
const load = () => {
  //count.value += 2
  //如果是异步请求,只需把异步请求得到的数据赋值给items即可
  var items=[
	{id:1,title:'华为竟然突破封锁发布高端手机'},
	{id:2,title:'一大批程序员在夜说猫公众号发牢骚?'},
	{id:3,title:'东南亚高薪工作,竟然是诈骗'},
	{id:4,title:'房价下跌,年轻人买房的机会来了吗'},
	{id:5,title:'为什么现在的武打戏越来越不好看了?'}];
	list.value=list.value.concat(items);
}

</script>

<style>
.infinite-list {
  height: 300px;
  padding: 0;
  margin: 0;
  list-style: none;
}
.infinite-list .infinite-list-item {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 50px;
  background: var(--el-color-primary-light-9);
  margin: 10px;
  color: var(--el-color-primary);
}
.infinite-list .infinite-list-item + .list-item {
  margin-top: 10px;
}
</style>

效果预览

夜说猫-Infinite Scroll 无限滚动

欢迎关注我的公众号【夜说猫】,一个程序员偶尔发牢骚的公众号。

### 关于 `v-infinite-scroll` 指令的使用和实现 #### 使用方法 为了在Vue应用中启用无限滚动功能,可以利用第三方库如 vue-infinite-scroll 或者自己编写逻辑来处理这一特性。当页面接近底部时触发加载更多数据的操作。 ```javascript import Vue from 'vue'; // 假设这里是从某个包管理工具安装并导入了插件 import InfiniteLoading from 'vue-infinite-loading'; Vue.use(InfiniteLoading); ``` 接着,在组件内部可以通过如下方式配置: ```html <template> <div class="content"> <!-- 列表项 --> <ul> <li v-for="(item, index) in items" :key="index">{{ item }}</li> </ul> <!-- 添加 infinite-loading 组件 --> <infinite-loading @infinite="loadMoreItems"></infinite-loading> </div> </template> <script> export default { data() { return { items: [], // 存储列表的数据 page: 1, }; }, methods: { loadMoreItems($state) { setTimeout(() => { fetch(`/api/items?page=${this.page}`) .then(response => response.json()) .then(data => { if (data.length) { this.items.push(...data); $state.loaded(); this.page += 1; } else { $state.complete(); // 表明已经没有更多的数据可加载 } }); }, 1000); // 模拟网络延迟 }, }, }; </script> ``` 上述代码展示了如何通过监听滚动事件自动请求新数据,并将其追加到现有列表中的过程[^1]。 #### 实现原理 对于自定义实现而言,核心在于监控用户的滚动行为以及何时触底。通常情况下,开发者会在窗口或容器上绑定scroll事件处理器,判断当前视口距离文档末端的距离是否小于一定阈值;一旦满足条件,则发起新的HTTP请求获取额外的内容片段,并更新DOM结构以展示这些新增条目。 此外,还需要考虑性能优化措施,比如防抖动(debounce)/节流(throttle),防止短时间内频繁触发不必要的API调用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值