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~~~

`el-select` 是 Element UI 中的一个下拉选择组件,它支持分页懒加载的功能。当 `el-select` 的选项非常多,无法一次性加载所有数据时,可以利用这个特性来提高用户体验。在这样的场景下,当用户滚动到选项列表底部时,只有当前页面未显示的数据才会通过异步请求从服务器获取并动态添加到下拉菜单中。 设置 `el-select` 的分页懒加载通常需要以下几个步骤: 1. **初始化状态**:在组件中声明一个变量,如 `currentPage` 和 `pageSize`,用于存储当前页数和每页的数量。 2. **API 接口**:定义一个返回分页数据的 API 函数,该函数接受当前页码作为参数。 3. **数据处理**:在渲染选项时,检查是否达到分页条件(比如,已加载数据量接近总选项量),然后调用 API 获取新数据,并合并到现有数据源中。 4. **分页组件**:如果你使用的是 Vue 等框架,可以使用 Vue 分页插件(如 vue-paginatejs)配合 `v-for` 指令来动态生成分页的选项列表。 5. **事件监听**:监听用户的滚动或者其他触发更新的事件,例如 `@scroll-end` 或者 `@load` 事件。 ```vue <template> <el-select v-model="selectedValue" :loading="isLoading"> <el-option v-for="item in paginatedOptions" :key="item.id" :label="item.label" :value="item.value" /> </el-select> <!-- 使用分页插件 --> <paginatejs ref="pagination" :items-per-page="pageSize" @change="loadPage"></paginatejs> </template> <script> export default { data() { return { selectedValue: '', currentPage: 1, pageSize: 10, options: [], // 初始化空数组,实际应用中这里应从服务端获取初始数据 isLoading: false, }; }, methods: { loadPage(page) { this.isLoading = true; this.fetchData(page); // 假设 fetchData 是你的 API 调用方法 }, fetchData(page) { this.$axios.get(`api/items?page=${page}&size=${this.pageSize}`) .then(response => { const { items } = response.data; this.options = [...this.options, ...items]; if (items.length < this.pageSize) { // 如果已经加载完,则关闭 loading this.isLoading = false; } }) .catch(err => { console.error('Error fetching data:', err); this.isLoading = false; }); }, }, }; </script> ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值