vant-list上拉加载,van-pull-refresh下拉刷新

 

不明白为什么会一直触发load事件,这篇博客https://blog.csdn.net/weixin_45121510/article/details/109078747中给了说明,具体如下:
        一、基础用法
            List 组件通过 loading 和 finished 两个变量控制加载状态,当组件滚动到底部时,会触发 load事件并将 loading 设置成 true。此时可以发起异步操作并更新数据,数据更新完毕后,将 loading 设置成 false 即可。若数据已全部加载完毕,则直接将 finished 设置成 true 即可。
        二、List 的运行机制是什么?
            List 会监听浏览器的滚动事件并计算列表的位置,当列表底部与可视区域的距离小于offset时,List会触发一次 load 事件。
        三、为什么 List 初始化后会立即触发 load 事件?
            List 初始化后会触发一次 load事件,用于加载第一屏的数据,这个特性可以通过immediate-check属性关闭。
        四、为什么会连续触发 load 事件?
            如果一次请求加载的数据条数较少,导致列表内容无法铺满当前屏幕,List 会继续触发 load事件,直到内容铺满屏幕或数据全部加载完成。因此你需要调整每次获取的数据条数,理想情况下每次请求获取的数据条数应能够填满一屏高度。
        五、loading 和 finished 分别是什么含义?
            List有以下三种状态,理解这些状态有助于你正确地使用List组件:
            非加载中,loading为false,此时会根据列表滚动位置判断是否触发load事件(列表内容不足一屏幕时,会直接触发)
            加载中,loading为true,表示正在发送异步请求,此时不会触发load事件
            加载完成,finished为true,此时不会触发load事件 在每次请求完毕后,需要手动将loading设置为false,表示加载结束
    用法:
<van-pull-refresh v-model="rainrefreshing" @refresh="onRefresh">
    <van-list v-model="rainloading" :finished="rainfinished" finished-text="没有更多了" :offset="100" @load="onLoad">

        </van-list>
</van-pull-refresh>

data数据:

pagesize: 0,
rainloading: false,
rainfinished: false,
rainrefreshing: false

methods方法:

        getRainData() {
            let _this = this
            let params = {
                current: _this.pagesize,
                riverName: _this.riverName,
                size: 15
            }
            queryRainfallWarn(params).then((res) => {
                if (res.code == 200) {
                    if (res.data.records.length > 0 && this.pagesize > 1) {
                        _this.rainData = _this.rainData.concat(res.data.records)
                    } else if (res.data.records.length > 0 && this.pagesize == 1) {
                        _this.rainData = res.data.records
                    } else if (res.data.records.length == 0) {
                        _this.rainfinished = true
                    }
                }
                _this.rainloading = false
            })
        },
        onLoad() {
            console.log('触发onload')
            if (this.rainrefreshing) {
                console.log('刷新')
                this.rainData = []
                this.rainrefreshing = false
            } else {
                this.pagesize += 1
                this.getRainData()
            }
        },
        // 下拉刷新
        onRefresh() {
            // 清空列表数据
            this.rainfinished = false
            // 重新加载数据
            // 将 rainloading 设置为 true,表示处于加载状态
            this.rainloading = true
            this.pagesize = 0
            this.onLoad()
        }
遇到的问题及解决:

1:在mounted或者create调用,,load也请求了数据,数据回来时已经请求两次了.所以只用load获取数据即可.
2:offset过于高,默认的高度是300,可以降低触发的高度
3.请求的数据过少,请求的数据不足以覆盖页面就会二次加载,可以将参数size调大,保证一次获取可以占满全屏

posted @ 2022-09-19 17:41  king'sQ  阅读(2730)  评论(0编辑  收藏  举报