【Vue2】PaginationSelect 带分页和搜索功能的下拉列表组件

news2024/11/26 12:15:26

1. 效果图

在这里插入图片描述

2. 组件完整代码

<template>
    <div class="pagination-select">
        <el-select
            v-model="selectedValue"
            :style="{ width: width || '100%' }"
            v-bind="attrs"
            :remote-method="remoteMethod"
            :loading="loading"
            @change="val => $emit('change', val)"
            @clear="onClear"
            @visible-change="val => $emit('visible-change', val)"
            :disabled="disabled"
        >
            <el-option v-for="item in optionSource" :key="item[keyValue]" :label="item[labelKey]" :value="item[valueKey]"></el-option>
            <el-pagination
                small
                layout="prev, pager, next"
                @current-change="val => pageChange(val)"
                :hide-on-single-page="false"
                :page-size="paginationOption.pageSize"
                :current-page="paginationOption.pageNum"
                :pager-count="pagerCount"
                :total="paginationOption.total"
            ></el-pagination>
        </el-select>
    </div>
</template>

<script>
export default {
    name: 'PaginationSelect',
    props: {
        value: {
            type: [String, Number, Object]
        },
        // 选择框宽度
        width: {
            type: String
        },
        // 下拉列表加载状态
        loading: {
            type: Boolean,
            default: false
        },
        // 传入的option数组中,要作为最终选择项的键值名称
        valueKey: {
            type: String,
            default: ''
        },
        //传入的option数组中,要作为显示项的键值名称
        labelKey: {
            type: String,
            default: ''
        },
        // 传入的option数组中,要作为显示项的key值
        keyValue: {
            type: String,
            default: ''
        },
        // 下拉框组件数据源
        optionSource: {
            type: Array,
            default: () => []
        },
        // 下拉框是否禁用
        disabled: {
            type: Boolean,
            default: false
        },
        // 按钮数,超过时会折叠
        pagerCount: {
            type: Number,
            default: 5
        },
        // 分页配置项
        paginationOption: {
            type: Object,
            default: () => {
                return {
                    pageNum: 1, // 当前页
                    pageSize: this.$store.state.app.pageSize, // 每页显示条数:默认20条
                    total: 0, // 总页数
                    keyword: ''
                }
            }
        }
    },
    computed: {
        selectedValue: {
            get() {
                return this.value
            },
            set(val) {
                this.$emit('input', val)
            }
        },
        attrs() {
            return {
                'popper-append-to-body': false,
                clearable: true,
                filterable: true,
                remote: true,
                ...this.$attrs
            }
        }
    },
    watch: {
        selectedValue(val) {
            this.selectedValue = val
        }
    },
    methods: {
        // 页码改变函数
        pageChange(val) {
            this.$emit('page-change', {
                pageNum: val,
                pageSize: this.paginationOption.pageSize,
                total: this.paginationOption.total,
                keyword: this.paginationOption.keyword
            })
        },
        // 远程搜索
        remoteMethod(query) {
            this.$emit('remote-method', {
                pageNum: 1,
                pageSize: this.paginationOption.pageSize,
                total: this.paginationOption.total,
                keyword: query
            })
        },
        onClear() {
            this.$emit('clear')
        }
    }
}
</script>

<style scoped lang="less">
.pagination-select {
    ::v-deep .el-pagination {
        display: flex;
        margin-top: 10px;
        margin-left: 16px;
        background-color: #fff;
        align-items: center;
        text-align: center;
        .el-pager {
            display: flex;
            align-items: center;
        }
    }
}
</style>

3. 组件使用示例

<el-form-item label="学校" prop="schoolNo">
    <PaginationSelect
        :loading="schoolLoading"
        width="360px"
        v-model="ruleForm.schoolNo"
        :optionSource="schoolOptions"
        labelKey="schoolName"
        valueKey="schoolNo"
        keyValue="schoolNo"
        :paginationOption="schoolPagination"
        @page-change="getSchoolList"
        @remote-method="getSchoolList"
        @visible-change="schoolNoFocus"
        @clear="handleClear()"
        :loading-text="schoolOptions.length && schoolLoading ? '加载中' : '无数据'"
    />
</el-form-item>
data() {
    return {
        schoolLoading: false,
        schoolOptions: [],
        schoolPagination: {
            pageNum: 1,
            pageSize: 10,
            total: 0,
            keyword: ''
        }
    }
},
methods: {
    // 弹窗初始化
    init(row) {
        this.dialogVisible = true
        this.getDetail(row.id)
        // 回显学校名称
        this.schoolOptions = [
            {
                schoolNo: row.schoolNo,
                schoolName: row.schoolName
            }
        ]
    },
    // 获取详情
    getDetail(id) {
        getClockEnrollCollectDetail({
            clockEnrollCollectId: id
        })
            .then(res => {
                this.ruleForm = res.data.data
            })
            .catch(err => {})
    },
    // 获取学校下拉
    getSchoolList(val) {
        this.schoolOptions = []
        this.schoolLoading = true
        enrollSchoolPage({
            pageNum: val.pageNum,
            pageSize: val.pageSize,
            nameOrNo: val.keyword || ''
        })
            .then(res => {
                this.schoolLoading = false
                if (res.data.data.records.length) {
                    this.schoolOptions = res.data.data.records || []
                    // 更新页码数据
                    this.schoolPagination = {
                        pageNum: val.pageNum,
                        pageSize: val.pageSize,
                        keyword: val.keyword || '',
                        total: res.data.data.total
                    }
                }
            })
            .catch(err => {
                this.schoolLoading = false
            })
    },
    // 学校下拉框出现/隐藏
    schoolNoFocus(val) {
        if (val) {
            this.getSchoolList(this.schoolPagination)
        } else {
            this.schoolPagination.pageNum = 1
            this.schoolPagination.keyword = ''
            this.schoolPagination.total = 0
        }
    },
    // 清空分页下拉列表选中的值重置下拉列表数据
    handleClear() {
        this.schoolPagination.pageNum = 1
        this.schoolPagination.keyword = ''
        this.schoolPagination.total = 0
        this.ruleForm.schoolNo = ''
        this.ruleForm.schoolName = ''
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【好书精读】网络是怎样连接的 向 DNS 服务器查询 Web 服务器的 IP 地址

&#xff08;该图由AI制作 学习AI绘图 联系我&#xff09; 目录 IP 地址的基本知识 实际的 IP 地址 域名和 IP 地址并用的理由 Socket 库提供查询 IP 地址的功能 通过解析器向 DNS 服务器发出查询 解析器的内部原理 IP 地址的基本知识 生成 HTTP 消息 根据域名查询 …

(嵌入式)TMS5700432BPZQQ1R、SPC58EC80E5QMC1X微控制器IC中文数据

TMS5700432BPZQQ1R 32位RISC闪存微控制器是设计用于安全系统的高性能汽车级微控制器。其采用的安全架构包括锁步中的双CPU、CPU和内存内置自检 (BIST) 逻辑、闪存和数据SRAM上的ECC、外设存储器上的奇偶校验以及外设I/O上的回路功能。TMS570LS0432/0332器件集成了ARM Cortex-R4…

孤立森林详解

基本概念 孤立森林&#xff08;Isolation Forest&#xff09;是一种基于异常检测的机器学习算法&#xff0c;用于识别数据集中的异常点。孤立森林算法在异常检测、网络入侵检测、金融欺诈检测等领域有广泛应用&#xff0c;并且在处理大规模数据和高维数据时表现出色。孤立森林…

了解不一样的Sui NFT标准

Sui的设计赋予非同质化Token&#xff08;NFT&#xff09;在灵活性、组合性和可交易性方面独特的属性&#xff0c;使NFT不仅仅代表指向图像的数字记录&#xff0c;还可以成为图像本身。这些NFT可以被修改或与其他NFT合并&#xff0c;以创造出可扩展的艺术作品。同时&#xff0c;…

分布式事务解决方案Seata谁建议你用的?

一、名词解释&#xff1a; TC (Transaction Coordinator) - 事务协调者 维护全局/分支事务的状态&#xff0c;驱动全局事务的提交与回滚 TM (Transaction Manager) - 事务管理器 定义全局事务的范围&#xff1a;开启、提交、回滚全局事务 RM (Resource Manager) - 资源管理…

云原生之深入解析如何使用Prometheus扩展Kubernetes调度器

一、kubernetes 调度配置 ① Scheduler Configuration kube-scheduler 提供了配置文件的资源&#xff0c;作为给 kube-scheduler 的配置文件&#xff0c;启动时通过 --config 来指定文件。目前各个 kubernetes 版本中使用的 KubeSchedulerConfiguration 为&#xff1a; 1.21 …

面试专题:spring

涉及到spring的问题都离不开IOC和AOP.AOP实现原理、动态代理和静态代理、Spring IOC的初始化过程、IOC原理、自己怎么实现一个IOC容器&#xff1f; 这些东西都是经常会被问到的。 IOC是什么&#xff1a; Ioc即控制反转&#xff0c;把原来的代码里需要实现的对象创建&#xff…

使用conda安装配置python环境

使用conda安装配置python环境 下载 我这里下载的是2-4.7.12.1&#xff0c;具体可以参考如下地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/ wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda2-4.7.12.1-Linux-x86_64.s…

d3dcompiler_47.dll缺失怎么修复?那个方法修复更简单

再运行游戏或者ps等软件&#xff0c;计算机系统提示找不到d3dcompiler_47.dll是怎么回事&#xff1f;相信困扰着不少小伙伴&#xff0c;其实d3dcompiler_47.dll是Microsoft 的 DirectX 11核心组件之一&#xff0c;它主要用于编译和运行 Direct3D 11应用程序和游戏。如果文件丢失…

编译安装LAMP

一、Apache网站服务&#xff1a; 1. Apache的起源&#xff08;多系统兼容&#xff09;&#xff1a; Apache HTTPD Server 简称 Apache&#xff0c;是 Apache 软件基金会的一个开源的网页服务器&#xff0c; 可以在大多数计算机操作系统中运行&#xff0c;由于其多平台和安全性…

美国国家量子计划咨询委员会发布更新国家量子计划建议

​ &#xff08;图片来源&#xff1a;网络&#xff09; 耗资12亿美元的美国国家量子计划&#xff08;NQI&#xff09;于2018年12月颁布&#xff0c;该计划为期10年&#xff0c;现在将开展审查前五年的活动&#xff0c;并对今后五年的推进计划提出建议。为此&#xff0c;美国国…

[经验]PMP快速通过指南

我的备考经验&#xff1a; 1一阶段&#xff1a;铺底&#xff0c;花费时间1.5周左右 主要是熟悉考试框架和内容&#xff0c;通过看网盘资料里的章节重点解析视频课后习题。 先看框架你就很清楚的了解下来&#xff0c;PMP考试把项目管理的过程拆解成了5大过程组&#xff08;启…

压力测试-JMeter安装、入门、结果分析

目录 1.写在前面 2.常用压测工具 3.压测机环境准备&#xff1a;JMeter部署 3.1 JMeter下载安装&启动&配置 3.2 入门案例 3.2.3、压测结果解释 3.2.4、线程属性参数原理 1.写在前面 等到服务上线后&#xff0c;在业务压力的冲击下&#xff0c;会发现程序运行非常…

CATIA和SolidWorks孰强孰弱?对比一下就知

寻找合适的 CAD 程序可能会很棘手&#xff0c;因为它是一种您将投资并使用的工具&#xff0c;您需要确保做出正确的决定。这篇文章将用于帮助区分 CATIA 和SOLIDWORKS之间的差异&#xff0c;以帮助您确定两者中哪一个最适合您的业务。 谁使用 CATIA&#xff1f; CATIA 于 198…

Selenium教程__环境安装(1)

Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 Selenium基本上支持主流的浏览器&#xff0c;包括IE&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google Chrome&#xff0c;Opera等。 …

请求与响应

设置映射路径 在不同的bean中可能会出现相同名字的路径&#xff0c;这样的情况会产生冲突&#xff0c;为了解决这个冲突我们可以设置模块名作为请求路径前缀 Controller RequestMapping("/book") public class BookController {//设置当前操作的访问路径RequestMa…

Rust语言从入门到入坑——(4)Rust语法(下)

文章目录 0 引入1、结构体1. 1 结构体1. 2 结构体方法1. 3 元组结构体 2、枚举类2.1 match2.2 Option 枚举类 3、集合3.1 向量&#xff08;Vector&#xff09;3.2 字符串&#xff08;String&#xff09;3.1 映射表&#xff08;Map&#xff09; 4、总结 0 引入 在这里我们需要介…

DOM4J解析web.xml文件,实例化Servlet

1、DOM4J解析web.xml文件实例化Servlet 原理分析&#xff1a;我们解析用户在地址栏中输入的地址信息如add.do,用这个地址去web.xml文件中通过DOM4J技术&#xff0c;解析判断add.do对应的是哪个url-pattern&#xff0c;找到后获取对应的servlet-name。在用这个servlet-name去找…

servlet规范过滤器

我们可以把servlet程序看作是一个最终要执行的目标。我们可以使用过滤器filter来添加过滤代码&#xff0c;这个过滤代码可以添加到servlet执行之前&#xff0c;也可以添加到servlet执行之后。Filter可以做到在servlet这个目标程序执行之前过滤&#xff0c;也可以在目标程序执行…