基于elementui的远程搜索下拉选择分页组件

news2025/1/12 1:52:46

在开发一个练手项目的时候,需要一个远程搜索的下拉选择组件;
elementui自带的el-select支持远程搜索;但如果一次性查询的数据过多;会导致卡顿。故自己实现一个可分页的远程下拉选择组件
效果:
在这里插入图片描述
代码:

<template>
  <el-select
    v-model="selectedValue"
    filterable
    remote
    reserve-keyword
    placeholder="请输入关键词"
    :remote-method="remoteSearch"
    :loading="loading"
    @change="handleChange"
    @focus="handleFocus"
    @clear="handleClear"
    clearable
  >
    <el-option
      v-for="item in options"
      :key="item[keyField]"
      :label="item[labelField]"
      :value="item[valueField]"
    />
    <div class="select-footer" v-if="total > 0">
      <div class="total-count">{{ total }}</div>
      <div class="select-pagination" v-if="total > pageSize">
        <el-pagination
          small
          layout="prev, pager, next"
          :total="total"
          :page-size="pageSize"
          :current-page.sync="currentPage"
          @current-change="handlePageChange"
        />
      </div>
    </div>

  </el-select>
</template>

<script>
import request from '@/utils/request'

export default {
  name: 'RemoteSearchSelect',
  props: {
    value: {
      type: [String, Number],
      default: ''
    },
    apiUrl: {
      type: String,
      required: true
    },
    // 自定义字段映射
    labelField: {
      type: String,
      default: 'label'
    },
    valueField: {
      type: String,
      default: 'value'
    },
    keyField: {
      type: String,
      default: 'id'
    },
    // 请求参数自定义
    searchParamName: {
      type: String,
      default: 'keyword'
    },
    pageParamName: {
      type: String,
      default: 'pageNum'
    },
    pageSizeParamName: {
      type: String,
      default: 'pageSize'
    },
    // 响应数据结构配置
    responseListField: {
      type: String,
      default: 'list'
    },
    responseTotalField: {
      type: String,
      default: 'total'
    },
    // 额外的请求参数
    extraParams: {
      type: Object,
      default: () => ({})
    }
  },
  data() {
    return {
      selectedValue: this.value,
      options: [],
      loading: false,
      currentPage: 1,
      pageSize: 10,
      total: 0,
      keyword: '',
      isFirstFocus: true,
      selectedOption: null
    }
  },
  created() {
    this.remoteSearch('');
  },
  methods: {
    async remoteSearch(query) {
      this.loading = true
      this.keyword = query
      try {
        const params = {
          [this.searchParamName]: query,
          [this.pageParamName]: this.currentPage,
          [this.pageSizeParamName]: this.pageSize,
          ...this.extraParams
        }
        // 使用配置的响应数据字段
        const responseData = await request({
          url: this.apiUrl,
          method: 'post',
          data: params
        })
        this.options = responseData[this.responseListField] || []
        this.total = responseData[this.responseTotalField] || 0
      } catch (error) {
        console.error('搜索出错:', error)
        this.$message.error('搜索失败,请重试')
      } finally {
        this.loading = false
      }
    },
    handleChange(value) {
      this.selectedOption = this.options.find(item => item[this.valueField] === value)
      this.$emit('input', value)
      this.$emit('change', value)
      this.$emit('select', this.selectedOption)
    },
    handleFocus() {
      // 如果是首次点击或当前没有选项,则执行搜索
        this.remoteSearch(this.keyword)
        this.isFirstFocus = false
    },
    handleClear() {
      this.selectedValue = ''
      this.keyword = ''
      this.selectedOption = null
      this.$emit('input', '')
      this.$emit('change', '')
      this.$emit('select', null)
      this.remoteSearch('')
    },
    async handlePageChange(page) {
      this.currentPage = page
      if (this.keyword) {
        await this.remoteSearch(this.keyword)
      }
    }
  },
  watch: {
    value: {
      handler(newVal) {
        this.selectedValue = newVal
      },
      immediate: true
    }
  }
}
</script>

<style scoped>
.select-footer {
  padding: 8px;
  border-top: 1px solid #EBEEF5;
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.total-count {
  color: #909399;
  font-size: 12px;
  padding-left: 8px;
}

:deep(.el-pagination) {
  padding: 0;
  margin-left: 8px;
}
</style>

用法

<remote-search-select
            v-model="assignForm.ownerId"
            api-url="remoteUrl"
            label-field="label"
            value-field="value"
            key-field="id"
            search-param-name="childName"
            response-list-field="rows"
            response-total-field="total"
            @select="handleProxyerSelectChange"
          />

参数介绍:

参数说明
v-model绑定的data数据
api-url远程查询的数据接口路径,方法名,请求方式为post
label-field需要展示的名称属性名
value-field下拉值的属性名
key-field主键的属性名
search-param-name模糊搜索的参数的字段名
response-list-field返回list的属性名
response-total-field返回list的总数的属性名
@selectfuntion,接收选中的值

组件可根据自己的具体需求做源码修改。

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

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

相关文章

网页端五子棋对战(二)---数据库连接用户登录注册接口设计postman验证

文章目录 1.用户模块--数据库的设计1.1idea新建db.sql文件1.2mysql建库建表 2.使用mybatis操作数据库2.1修改spring配置文件2.2创建实体类用户user2.3创建Mapper接口2.4实现xml配置文件 3.前后端交互接口架构4.后端代码实现4.1登录模块4.2注册模块4.3获取用户信息 5.postman验证…

ElementUI 问题清单

1、form 下面只有一个 input 时回车键刷新页面 原因是触发了表单默认的提交行为&#xff0c;给el-form 加上submit.native.prevent就行了。 <el-form inline submit.native.prevent><el-form-item label"订单号"><el-inputv-model"query.order…

数据科学与大数据之间的区别

什么是数据科学&#xff1f; 数据科学是一个跨学科领域&#xff0c;它将统计学和计算方法相结合&#xff0c;旨在从数据中提取见解和知识。它涉及收集、处理、分析以及解读数据&#xff0c;以揭示可用于为决策过程提供依据并推动创新的模式、趋势和关系。 数据科学涵盖了广泛…

2024 数学建模国一经验分享

2024 数学建模国一经验分享 背景&#xff1a;武汉某211&#xff0c;专业&#xff1a;计算机科学 心血来潮&#xff0c;就从学习和组队两个方面指点下后来者&#xff0c;帮新人避坑吧 2024年我在数学建模比赛中获得了国一&#xff08;教练说论文的分数是湖北省B组第一&#xff0…

利用断开的域管理员RDP会话提权

前言 当域内管理员登录过攻击者可控的域内普通机器运维或者排查结束后&#xff0c;退出3389时没有退出账号而是直接关掉了远程桌面&#xff0c;那么会产生哪些风险呢&#xff1f;有些读者第一个想到的肯定就是抓密码&#xff0c;但是如果抓不到明文密码又或者无法pth呢&#x…

在c#控制台中使用Raylib-cs库,绘制控制小球和插入音频(附带c++中小球的控制代码)

下载网址 GitHub - chrisdill/raylib-cs: C# bindings for raylib, a simple and easy-to-use library to learn videogames programming 克隆库 克隆GitHub仓库-CSDN博客 1 .制作dll 点击 生成之后就会多出这些东西 2.在项目中添加dll 然后就导进来了 测试一下用例代码 …

11月 | Apache SeaTunnel月度进展总结

各位热爱 Apache SeaTunnel 的小伙伴们&#xff0c;社区10月份月报更新啦&#xff01;这里将记录 SeaTunnel 社区每月的重要更新&#xff0c;欢迎关注&#xff01; 月度Merge之星 感谢以下小伙伴 11 月份为 Apache SeaTunnel 所做的精彩贡献&#xff08;排名不分先后&#xf…

实数与复数频谱掩蔽在音频分离中的应用

使用实数和复数频谱掩蔽进行音频分离 频谱掩蔽是指在音频信号的频谱表示中&#xff0c;通过选择性地增强或抑制某些频率成分来改善信号质量或实现信号分离的技术。频谱掩蔽可以分为两种类型&#xff1a;实数掩蔽和复数掩蔽。 实数频谱掩蔽 实数频谱掩蔽主要关注音频信号的幅…

数学建模之RSR秩和比综合评价法(详细)

RSR秩和比综合评价法 一、概述 秩和比法(Rank-sum ratio&#xff0c;简称RSR法)是我国学者田凤调于1988年提出的&#xff0c;田教授是我国杰出的卫生统计学家&#xff0c;该方法最初提出时用于解决医学卫生领域的综合评价问题&#xff0c;后经各领域学者的补充和完善&#xf…

【贪心算法】贪心算法五

贪心算法五 1.跳跃游戏 II2.跳跃游戏3.加油站3.单调递增的数字 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.跳跃游戏 II 题目链接&…

STM32编码器接口及编码器测速模板代码

编码器是什么&#xff1f; 编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感 器&#xff0c;我们可以通过编码器测量到底位移或者速度信息。编码器从输出数据类型上 分&#xff0c;可以分为增量式编码器和绝对式编码器。 从编码器检测原理上来分&#xff0…

经典视觉神经网络1 CNN

一、概述 输入的图像都很大&#xff0c;使用全连接网络的话&#xff0c;计算的代价较高&#xff0c;图像也很难保留原本特征。 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种专门用于处理具有网格状结构数据的深度学习模型。主要应用…

黑马程序员MybatisPlus/Docker相关内容

Day01 MP相关知识 1. mp配置类&#xff1a; 2.条件构造器&#xff1a; 具体的实现例子&#xff1a; ①QuerryWapper&#xff1a; ②LambdaQueryWrapper: 3.MP的自定义SQL 4.MP的Service层的实现 5.IService下的Lambda查询 原SQL语句的写法&#xff1a; Lambda 查询语句的…

通讯专题4.1——CAN通信之计算机网络与现场总线

从通讯专题4开始&#xff0c;来学习CAN总线的内容。 为了更好的学习CAN&#xff0c;先从计算机网络与现场总线开始了解。 1 计算机网络体系的结构 在我们生活当中&#xff0c;有许多的网络&#xff0c;如交通网&#xff08;铁路、公路等&#xff09;、通信网&#xff08;电信、…

低级爬虫实现-记录HCIP云架构考试

因工作需要考HCIP云架构&#xff08;HCIP-Cloud Service Solution Architect&#xff09;证书, 特意在淘宝上买了题库&#xff0c; 考过了。 事后得知自己被坑了&#xff0c; 多花了几十大洋。 所以想着在授权期内将题库“爬”下来&#xff0c; 共享给大家。 因为整个过程蛮有…

最新AI问答创作运营系统(SparkAi系统),GPT-4.0/GPT-4o多模态模型+联网搜索提问+问答分析+AI绘画+管理后台系统

目录 一、人工智能 系统介绍文档 二、功能模块介绍 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI大模型 多模态模型文档分析 多模态识图理解能力 联网搜索回复总结 3.2 AI智能体应用 3.2.1 AI智能体/GPTs商店 3.2.2 AI智能体/GPTs工作台 3.2.3 自…

借助 AI 工具,共享旅游-卡-项目助力年底增收攻略

年底了&#xff0c;大量的商家都在开始筹备搞活动&#xff0c;接下来的双十二、元旦、春节、开门红、寒假&#xff0c;各种活动&#xff0c;目的就是为了拉动新客户。 距离过年还有56 天&#xff0c;如何破局&#xff1f; 1、销售渠道 针对旅游卡项目&#xff0c;主要销售渠道…

AndroidStudio-常见界面控件

一、Button package com.example.review01import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.TextViewclass Review01Activity : AppCompatActivity() {override fun onCreate(savedInstanceStat…

【SpringMVC】参数传递 重定向与转发 REST风格

文章目录 参数传递重定向与转发REST风格 参数传递 ModelAndView&#xff1a;包含视图信息和模型数据信息 public ModelAndView index1(){// 返回页面ModelAndView modelAndView new ModelAndView("视图名");// 或// ModelAndView modelAndView new ModelAndView(…

Vue网页屏保

Vue网页屏保 在vue项目中&#xff0c;如果项目长时间未操作需要弹出屏幕保护程序&#xff0c;以下为网页屏保效果&#xff0c;看板内容为连接的资源。 屏保组件 <template><div v-if"isActive" class"screensaver" click"disableScreens…