el-select如何实现懒加载(带搜索功能)

48 篇文章 2 订阅
31 篇文章 1 订阅

<!--
<template>
    <el-select
        :value="value"
        v-loadmore="loadMore"
        @focus="focus"
        @clear="clear"
        filterable
        remote
        :filter-method="handleSearch"
        :loading="loading"
        clearable
        v-bind="$attrs"
        v-on="$listeners"
    >
        <el-option
            v-for="option in data"
            :label="option[dictLabel]"
            :value="option[dictValue]"
            :key="option.value"
        ></el-option>
        <!-- 此处加载中的value可以随便设置,只要不与其他数据重复即可 -->
        <el-option
            v-if="hasMore"
            disabled
            label="加载中..."
            value="-1"
        ></el-option>
    </el-select>
</template>

<script>
export default {
    props: {
        value: {
            default: ""
        },
        // 列表数据
        data: {
            type: Array,
            default: () => []
        },
        dictLabel: {
            type: String,
            default: "label"
        },
        dictValue: {
            type: String,
            default: "value"
        },
        // 调用页数的接口
        request: {
            type: Function,
            default: () => {}
        },
        // 传入的页码
        page: {
            type: [Number, String],
            default: 1
        },
        // 是否还有更多数据
        hasMore: {
            type: Boolean,
            default: true
        }
    },
    directives: {
        // 这里实现一个组件内部的自定义指令
        loadmore: {
            // 指令的定义
            bind(el, binding) {
                const SELECTWRAP = el.querySelector(
                    ".el-select-dropdown .el-select-dropdown__wrap"
                );
                if (!SELECTWRAP) {
                    throw new Error('获取不到"el-select-dropdown__wrap"节点');
                }
                SELECTWRAP.addEventListener("scroll", () => {
                    // scrollTop  这里可能因为浏览器缩放存在小数点的情况,导致了滚动到底部时
                    // scrollHeight 减去滚动到底部时的scrollTop ,依然大于clientHeight 导致无法请求更多数据
                    // 这里将scrollTop向上取整 保证滚到底部时,触发调用
                    const CONDITION =
                        SELECTWRAP.scrollHeight -
                            Math.ceil(SELECTWRAP.scrollTop) <=
                        SELECTWRAP.clientHeight;
                    // el.scrollTop !== 0 当输入时,如果搜索结果很少,以至于没看到滚动条,那么此时的CONDITION计算结果是true,会执行bind.value(),此时不应该执行,否则搜索结果不匹配
                    if (CONDITION && SELECTWRAP.scrollTop !== 0) {
                        binding.value();
                    }
                });
            }
        }
    },
    data() {
        return {
            keyword: "", // 存储关键字用
            loading: false
        };
    },
    methods: {
        // 请求下一页的数据
        loadMore() {
            // 如果没有更多数据,则不请求
            if (!this.hasMore) {
                return;
            }
            // 如果intercept属性为true则不请求数据,
            if (this.loadMore.intercept) {
                return;
            }
            this.loadMore.intercept = true;
            this.request({
                page: this.page + 1,
                more: true,
                keyword: this.keyword
            }).then(() => {
                this.loadMore.intercept = false;
            });
        },
        // 选中下拉框没有数据时,自动请求第一页的数据
        focus() {
            if (!this.data.length) {
                this.request({ page: 1 });
            }
        },
        handleSearch(keyword) {
            this.keyword = keyword;
            this.loading = true;
            console.log(keyword);
            this.request({ page: 1, keyword: keyword }).then(() => {
                this.loading = false;
            });
        },
        // 删除选中时,如果请求了关键字,则清除关键字再请求第一页的数据
        clear() {
            if (this.keyword) {
                this.keyword = "";
                this.request({ page: 1 });
            }
        }
    }
};
</script>


参考文章:
el-select下拉加载

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-tree-selectElement UI库中的一个组件,用于展示树形结构的下拉选择框。实现懒加载可以提高性能,只在需要展开节点时才加载子节点数据。 要实现el-tree-select懒加载,需要以下步骤: 1. 在el-tree-select组件中设置lazy属性为true,表示开启懒加载模式。 2. 在el-tree-select组件中设置load方法,用于加载子节点数据。load方法接收两个参数:node和resolve。node表示当前需要加载子节点的节点对象,resolve是一个回调函数,用于将加载的子节点数据传递给el-tree-select组件。 3. 在load方法中,根据node的信息发送异步请求获取子节点数据,并在请求成功后调用resolve方法将数据传递给el-tree-select组件。 下面是一个示例代码: ```html <template> <el-tree-select v-model="selectedNode" :lazy="true" :load="loadData" ></el-tree-select> </template> <script> export default { data() { return { selectedNode: null }; }, methods: { loadData(node, resolve) { // 发送异步请求获取子节点数据 // 假设请求返回的数据格式为[{ label: 'Node 1', id: 1, children: [] }, ...] axios.get('/api/getChildren', { params: { nodeId: node.id } }) .then(response => { // 将子节点数据传递给el-tree-select组件 resolve(response.data); }) .catch(error => { console.error(error); }); } } }; </script> ``` 在上面的示例中,loadData方法使用axios发送异步请求获取子节点数据,并在请求成功后调用resolve方法将数据传递给el-tree-select组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值