vue页面实现盒子内滚动加载分页数据

该代码示例展示了如何在Vue.js应用中处理滚动事件以实现无限滚动加载。当用户滚动到底部时,数据会按页码分批加载,直到没有更多数据时显示提示信息。

代码块

<div class="box" @scroll="handleScroll"></div>
<div v-if="noMore">没有更多啦~</div>
data(){
	return{
	  setTime:null,
      noMore:false,
      list:[],
      page:{
      	page_no:1,
      	totalPage:1,
      	page_size:10
	  }
	}
},
methods:{
	 handleScroll(e){
      const { scrollTop, clientHeight, scrollHeight } = e.target;
      if (scrollTop + clientHeight === scrollHeight) {
        if (this.setTime) return;
        if (this.page.page_no < this.page.totalPage) {
          this.setTime = setTimeout(() => {
            this.page.page_no+=1
            this.noMore=false
            // 获取数据
            this.getData();
            this.setTime = null;
          }, 500);
        }else{
          this.noMore=true
        }
      }
    },
    //获取数据
    getData() {
      if (this.page.page_no == 1) {
        this.list = [];
      }
      let sendData = {
        page_no: this.page.page_no,
        page_size: this.page.page_size,
      };

      this.$getData(sendData).then((res) => {
       	let data=res.data
        let totalPage = parseInt(
          res.data.page_result.total_count / this.page.page_size
        );
        if (res.data.page_result.total_count % this.page.page_size > 0) {
          totalPage = totalPage + 1;
        }
        if (!totalPage) {
          totalPage = 1;
        }
        this.page.totalPage = totalPage;
        this.list = this.list.concat(data);
      });
    },
}
### 实现思路 为了在 Vue3 与 JavaScript 环境下实现 PC 端页面滚动加载功能,其中 C 盒子占满全高并展示请求数据,同时在滚动至最后一行时加载下一页数据,并保持上滑时已有数据不丢失,可以按照以下步骤进行。 #### 1. 页面结构设计 首先,需要设计页面结构,确保 C 盒子能够占满全高。可以通过 CSS 的 `flex` 布局实现。C 盒子内部采用 `grid` 布局,实现一行两列的展示效果。 ```html <template> <div class="container"> <div class="c-box" ref="cBox" @scroll="handleScroll"> <div class="item" v-for="(item, index) in items" :key="index"> {{ item }} </div> </div> </div> </template> ``` ```css .container { display: flex; flex-direction: column; height: 100vh; } .c-box { flex: 1; overflow-y: auto; display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; padding: 10px; } .item { border: 1px solid #ccc; padding: 10px; text-align: center; } ``` #### 2. 数据请求与分页加载Vue3 中,可以使用 `ref` 来获取 DOM 元素并监听滚动事件,当滚动到底部时触发数据请求。使用 `ref` 和 `reactive` 来管理数据状态,确保上滑时已有数据不丢失。 ```javascript <script setup> import { ref, onMounted } from 'vue'; const items = ref([]); const page = ref(1); const loading = ref(false); const cBox = ref(null); const fetchData = async () => { if (loading.value) return; loading.value = true; // 模拟数据请求 const newItems = []; for (let i = 0; i < 10; i++) { newItems.push(`Item ${(page.value - 1) * 10 + i + 1}`); } items.value = [...items.value, ...newItems]; page.value++; loading.value = false; }; const handleScroll = () => { const box = cBox.value; if (box.scrollTop + box.clientHeight >= box.scrollHeight - 5) { fetchData(); } }; onMounted(() => { fetchData(); }); </script> ``` #### 3. 滚动加载逻辑 在 `handleScroll` 函数中,判断是否滚动到底部。当滚动到底部时,调用 `fetchData` 函数加载下一页数据。通过 `loading` 状态防止重复请求。 #### 4. 保持已有数据不丢失 由于 `items` 是一个响应式数组,当新的数据加载时,旧的数据仍然保留在数组中,因此上滑时已有数据不会丢失。 ### 总结 通过上述步骤,可以在 Vue3 与 JavaScript 环境下实现 PC 端页面滚动加载功能,确保 C 盒子占满全高并展示请求数据,同时在滚动至最后一行时加载下一页数据,并保持上滑时已有数据不丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值