vue select 分页加载数据(懒加载)

有时候下拉数据量过大,会出现卡住的现象。本文就是解决这个问题,实现下拉框分页加载。

在 el-selec 上 加 v-el-select-loadmore 指令(在下面定义)

<template>
    <el-form :inline="true" size="small">
        <el-form-item label="小区">
            <el-select v-model="reqParams.communityId" v-el-select-loadmore="loadmore" clearable>
                <el-option value="" label="全部" />
                <el-option v-for="item in communityList" :key="item.id" :label="item.name" :value="item.id" />
            </el-select>
        </el-form-item>
    </el-form>
</template>

Vue.directive: 注册或获取全局指令。

bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。

具体可以看官方文档,在此就不在赘述了。

// 自定义指令
directives: {
    "el-select-loadmore": {
        bind(el, binding) {
            // 获取element-ui定义好的scroll盒子
            const SELECTWRAP_DOM = el.querySelector(".el-select-dropdown .el-select-dropdown__wrap")
            SELECTWRAP_DOM.addEventListener("scroll", function () {
                /*   scrollHeight 获取元素内容高度(只读)
                     scrollTop 获取或者设置元素的偏移值,常用于, 计算滚动条的位置, 当一个元素的容器没有产生垂直方向的滚动条, 那它的scrollTop的值默认为0.
                    clientHeight 读取元素的可见高度(只读)
                      */
                const condition = this.scrollHeight - this.scrollTop <= this.clientHeight
                // 判断滚动到底部  (condition:如果元素滚动到底, 下面等式返回true, 没有则返回false)
                if (condition) {
                    // binding.value 为自定义指令绑定的值,因为绑定的是个方法,所以这里是方法调用,触发指令后执行加载数据
                    binding.value()
                }
            })
        }
    }
},

定义一个方法,分页获取数据,具体请看代码:

methods: {
    //获取小区
    async loadmore() {
        try {
            if (this.communityParams.pageNo == 1 || this.communityParams.pageNo <= this.totalPage) {
                let params = Object.assign({}, this.communityParams)
                const { data } = await this.$axios.get(API_DEVICE_COMMON_COMMUNITY, { params: params })
                this.totalPage = data.totalPage
                this.communityList =
                    this.communityParams.pageNo == 1 ? data.list : [...this.communityList, ...data.list]
            }
            this.communityParams.pageNo++
        } catch (e) {
            this.$log.error(e)
        }
    }
}

直接上图~~~
在这里插入图片描述


之前用这种方法解决了 vue select 下拉 加载 请求接口的问题。
但是最近发现不知道为什么原来好好的,下来没有效果了。打印之后发现:在这里插入图片描述
滚动到底部,condition 计算出现了错误 导致滚动 之后不调用方法。
于是在这里插入代码片 const condition = this.scrollHeight - this.scrollTop <= this.clientHeight + 1
默默+1 ,效果倒是出现了,不知道会不会有其他影响,也不是很清楚为什么会导致 计算错误。
如果有人知道,请指出来哦~ thankyou~~~

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值