您现在的位置是:网站首页> 编程资料编程资料

vant中list的使用以及首次加载触发两次解决问题_vue.js_

2023-05-24 347人已围观

简介 vant中list的使用以及首次加载触发两次解决问题_vue.js_

vant中list使用及首次加载触发两次

以下是list的基本使用方法,主要原理就是当页面数据小于offset这个高度的时候,就会触发load,在load里面需要调用接口发送下一页的数据.所以发送完毕后需要将设置分页的属性加一,并将获取到的新值push进接收数据的数组里,而不是直接赋值,如果直接赋值那么数组里就只有新值,之前的值就被覆盖.

调用完以后将loading的样式关闭,并且判断数据库中还有没有数据,如果没有,就将finished为true,表示已经加载完毕了.

首次加载触发两次解决问题

1.在mounted或者create调用,原因是有可能在数据没回来的时候load就监测到数据低于高度,也发送了一次,等到数据回来时已经请求两次了.所以干脆不需要调用,交给load检测即可.

2.offset过于高,默认的高度是300,有一次获取数据一次只获取5条,虽然覆盖了页面高度,但稍作触碰就会二次发送.

3.请求的数据过少,请求的数据不足以覆盖页面就会二次加载,可以看文档list第一条示例便是.

vant中list列表组件使用

List 的运行机制:

List 会监听浏览器的滚动事件并计算列表的位置,当列表底部与可视区域的距离小于offset时,List 会触发一次 load 事件。

1. 基础结构

           // 循环列表数据            
{{item}}循环出来的数据
        2.data声明: data() {     return {       loading: false,         // 是否处在加载状态       finished: false,        // 是否已加载完成       error: false,           // 是否加载失败       list: [],               // 数据项       page: 1,                // 分页       page_size: 10           // 每页条数       total: 0                // 数据总条数     } }

3.methods定义方法 

methods: {     onLoad() {       // 异步更新数据       // setTimeout 仅做示例,真实场景中一般为 ajax 请求       setTimeout(() => {         for (let i = 0; i < 10; i++) {           this.list.push(this.list.length + 1);         }           // 加载状态结束         this.loading = false;           // 数据全部加载完成         if (this.list.length >= 40) {           this.finished = true;         }       }, 1000);     },   }, };

4.调用api渲染页面

导入这个接口  import {  } from '@/api/xxx.js'

async onLoad () {   const res = await 接口方法名(this.channel.id, Date.now())   // 获取的数据   const arr = res.data.data.results // 它是一个数组   // 1. 追加数据到list   //    对数组进行展开   this.list.push(...arr)   // 2. 把loading设置为false   this.loading = false   // 3. 判断是否所有的数据全部加载完成,如果是:finished设为true   if (arr.length === 0) {     // 说明取不到数据了     this.finished = true   }   // 4. 页面上提示一下用户   this.$toast.success('成功加载数据') }

loading 和 finished 分别是什么含义?

List有以下三种状态,理解这些状态有助于你正确地使用List组件:

  • 非加载中,loading为false,此时会根据列表滚动位置判断是否触发load事件(列表内容不足一屏幕时,会直接触发)
  • 加载中,loading为true,表示正在发送异步请求,此时不会触发load事件
  • 加载完成,finished为true,此时不会触发load事件

在每次请求完毕后,需要手动将loading设置为false,表示加载结束

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

-六神源码网