数据过多select懒加载

el-select数据过多页面卡顿—懒加载(下拉框可搜索)

在这里插入图片描述

<template>
    <div class="modal">
        <div class="form-item">
            <el-form ref="form" :model="form" label-width="100px" :rules="rules">
                <el-form-item label="角色:" prop="roleName">
                    <el-select
                        style="width: 100%"
                        v-model="form.roleName"
                        placeholder="请选择"
                        clearable
                        filterable
                    >
                        <el-option
                            v-for="item in roleOptions"
                            :key="item.id"
                            :label="item.roleName"
                            :value="item.roleName"
                        >
                        </el-option>
                    </el-select>
                </el-form-item>

                <el-form-item label="用户:" prop="users">
                    <el-select style="width: 100%"
                               v-model="form.users" placeholder="请选择"
                               multiple
                               clearable
                               filterable
                               :filter-method="dataFilter"
                               v-el-select-loadmore.rangeNumber="loadmore(rangeNumber)"
                    >
                        <el-option
                            v-for="item in newUserList.slice(0,rangeNumber)"
                            :key="item.id"
                            :label="item.userName"
                            :value="item.id"

                        />
                    </el-select>
                </el-form-item>


            </el-form>
        </div>
        <div class="menu">
            <modal-menu @comfirmHandle="save"></modal-menu>
        </div>
    </div>
</template>
<script>
import modalMenu from "@components/modal-menu.vue";
import {addRoleUser} from "@api/index"

export default {
    components: {
        modalMenu,
    },
    directives: {
        'el-select-loadmore': {
            bind(el, binding) {
                // 获取element-ui定义好的scroll盒子
                // const SELECTWRAP_DOM = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap');
                const SELECTWRAP_DOM = el.querySelector('.el-scrollbar__wrap');
                SELECTWRAP_DOM.addEventListener('scroll', function () {
                    /**
                     * scrollHeight 获取元素内容高度(只读)
                     * scrollTop 获取或者设置元素的偏移值,常用于, 计算滚动条的位置, 当一个元素的容器没有产生垂直方向的滚动条, 那它的scrollTop的值默认为0.
                     * clientHeight 读取元素的可见高度(只读)
                     * 如果元素滚动到底, 下面等式返回true, 没有则返回false:
                     * ele.scrollHeight - ele.scrollTop === ele.clientHeight;
                     * -2 :个别浏览器获取像素不足整数,导致condition一直为false无法实现滚动加载
                     */
                    const condition = this.scrollHeight - this.scrollTop - 2 <= this.clientHeight;
                    if (condition) {
                        binding.value();
                    }
                }, true);
            }
        }
    },
    props: {
        newRow: Object,
        type: String,
        userOptions: Array,
        roleOptions: Array,
    },

    data() {
        return {
            form: {},
            rules: {
                roleName: [{required: true, message: '内容不能为空', trigger: ["blur", "change"]}],
                users: [{required: true, message: '内容不能为空', trigger: ["blur"]}],
            },
            userOptions1: [],
            newUserList: [], //人员过滤后的数据
            rangeNumber: 20,//初始加载条数
        };
    },

    mounted() {
        if (this.type == 'edit') {
            this.form = this.newRow
        }
        this.getList(this.userOptions)
    },
    methods: {
        getList(userList) {
            for (let i = 0; i < userList.length; i++) {
                this.newUserList.push(userList[i])
            }
        },
        dataFilter(val) {//未懒加载出来的数据也可被搜索到
            this.newUserList = []
            if (val) {
                this.newUserList = this.userOptions.filter((item) => {
                    // console.log(item,888)
                    if (item.userName && item.userName.indexOf(val) !== -1) {
                        return true
                    }
                })
            } else { //val为空时,还原数组
                this.getList(this.userOptions)
            }
        },

        loadmore() {
            return () => {
                this.rangeNumber += 5//滚动新增条数
            }
        },

        save() {
            this.$refs["form"].validate((valid) => {
                if (valid) {
                    let param = []
                    let roleId = ""
                    for (let item of this.roleOptions) {
                        if (item.roleName === this.form.roleName) {
                            roleId = item.id
                        }
                    }
                    let arr = this.form.users
                    for (let item of arr) {
                        for (let j of this.userOptions) {
                            if (j.id == item) {
                                param.push({id: "", roleId: roleId, userId: j.id, userName: j.userName})
                            }
                        }
                    }
                    addRoleUser(param).then(() => {
                        this.$message("操作成功")
                        this.$emit('confirmSuccess')
                        this.$emit('close')
                    })
                } else {
                    return false;
                }
            });
        },

    },
};
</script>

<style lang="scss" scoped>
.modal {
    width: 100%;
    height: 100%;
    overflow: hidden;
    padding: 50px 40px 0 20px;
}

::v-deep .el-form-item__error {
    margin-top: -13px;
}

::v-deep .el-form-item__label {
    font-weight: 900;
}

::v-deep .el-form-item {
    margin-bottom: 40px;
}

::v-deep .el-select__tags {
    max-height: 120px;
    overflow-y: auto;
}
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值