element-plus(vue3)表单el-select下拉框的远程分页下拉触底关键字搜索实现

news2025/4/26 10:26:08

一、基础内核-自定义指令

1.背景

2.定义

3.使用

4.注意

当编辑时需要回显,此时由于分页导致可能匹配不到对应label文本显示,此时可以这样解决

二、升级使用-二次封装组件

三、核心代码

1.自定义指令

定义

----------------selectLoadMoreDirective.ts--------------------

import { Directive, DirectiveBinding, nextTick } from "vue";
import { debounce } from "../utils/index";

const loadMore: Directive = {
  beforeMount(el: any, binding: DirectiveBinding) {
    // 查询下拉框的滚动容器
    const popperClassName = el.getAttribute("popper-class-name");
    let selectDom = document.querySelector(
      `.${popperClassName} .el-select-dropdown__wrap`
    );
    function loadMores(this: any) {
      // 判断是否滚动到底部
      const isBase =
        this.scrollHeight - this.scrollTop - 1 <= this.clientHeight;
      if (isBase) {
        binding.value && binding.value(); // 触发绑定的回调函数
      }
    }

    // 使用防抖处理滚动事件
    const debouncedLoadMore = debounce(loadMores, 300); // 设置防抖时间为300ms

    el.selectDomInfo = selectDom;
    el.userLoadMore = debouncedLoadMore; // 将防抖后的函数赋值给 el.userLoadMore
    nextTick(() => {
      selectDom?.addEventListener("scroll", debouncedLoadMore);
    });
  },
  beforeUnmount(el: any) {
    if (el.userLoadMore) {
      el.selectDomInfo?.removeEventListener("scroll", el.userLoadMore);
      delete el.selectDomInfo;
      delete el.userLoadMore;
    }
  },
};

export default loadMore;

全局注册 

------------------main.ts-----------------
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
import router from './router'
import loadMore from '@/directive/selectLoadMoreDirective'

const app = createApp(App)

app.use(ElementPlus)
app.use(router)
app.directive('loadMore', loadMore)
app.mount('#app')

2.二次封装组件代码

定义

-------------------------CustomSelect.vue---------------------------

<template>
  <el-select
    v-model="selectedValue"
    v-loadMore="loadMore"
    :popper-class="popperClassName"
    :popper-class-name="popperClassName"
    :remote-method="remoteMethod"
    :loading="loading"
    :placeholder="placeholder"
    :style="style"
    filterable
    remote
  >
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item"
    />
  </el-select>
</template>

<script setup lang="ts">
import { ref, watch } from "vue";

// 定义 props
const props = defineProps({
  // 双向绑定值
  modelValue: {
    type: [Object, String, Number],
    default: null,
    required: true
  },
  placeholder: {
    type: String,
    default: "请选择",
  },
  popperClassName: {
    type: String,
    default: "",
    required: true
  },
  remoteMethod: {
    type: Function,
    required: true
  },
  loading: {
    type: Boolean,
    default: false,
  },
  style: {
    type: Object,
    default: () => ({}),
  },
  loadMore: {
    type: Function,
    required: true,
  },
  options: {
    type: Array<{ value: number; label: string }>,
    default: () => [],
    required: true
  },
});

// 加载状态
const loading = ref(false);

// 定义 emits
const emit = defineEmits(["update:modelValue"]);

// 双向绑定值
const selectedValue = ref(props.modelValue);

// 监听 modelValue 的变化
watch(
  () => props.modelValue,
  (newVal) => {
    selectedValue.value = newVal;
  }
);

// 监听 selectedValue 的变化并触发更新
watch(selectedValue, (newVal) => {
  emit("update:modelValue", newVal);
});
</script>

<style scoped>
/* 自定义样式 */
</style>

使用

----------------------xxx.vue------------------------------

<template>

            <CustomSelect
              v-model="selectedGrade"
              placeholder="选择年级"
              popper-class-name="grade_select2"
              :remote-method="searchGrades"
              :style="{ width: '100px', marginRight: '10px' }"
              :load-more="() => loadMore('grade')"
              :options="grades"
            />
</template>

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

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

相关文章

轻松完成视频创作,在线视频编辑器,无需下载软件,功能多样实用!

小白工具的在线视频编辑https://www.xiaobaitool.net/videos/edit/ 功能丰富、操作简便&#xff0c;在线裁剪或编辑视频工具&#xff0c;轻松完成视频创作能满足多种视频编辑需求。 格式支持广泛&#xff1a;可编辑超百种视频格式&#xff0c;基本涵盖常见和小众视频格式&#…

豆瓣图书数据采集与可视化分析(三)- 豆瓣图书数据统计分析

文章目录 前言一、数据读取与保存1. 读取清洗后数据2. 保存数据到CSV文件3. 保存数据到MySQL数据库 二、不同分类统计分析1. 不同分类的图书数量统计分析2. 不同分类的平均评分统计分析3. 不同分类的平均评价人数统计分析4. 不同分类的平均价格统计分析5. 分类综合分析 三、不同…

c++进阶——类与继承

文章目录 继承继承的基本概念继承的基本定义继承方式继承的一些注意事项 继承类模板 基类和派生类之间的转换继承中的作用域派生类的默认成员函数默认构造函数拷贝构造赋值重载析构函数默认成员函数总结 不能被继承的类继承和友元继承与静态成员多继承及其菱形继承问题继承模型…

复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航

作者&#xff1a; Mohammad Nazeri 1 ^{1} 1, Anuj Pokhrel 1 ^{1} 1, Alexandyr Card 1 ^{1} 1, Aniket Datar 1 ^{1} 1, Garrett Warnell 2 , 3 ^{2,3} 2,3, Xuesu Xiao 1 ^{1} 1单位&#xff1a; 1 ^{1} 1乔治梅森大学计算机科学系&#xff0c; 2 ^{2} 2美国陆军研究实验室&…

Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示,实现前后端交互

Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示&#xff0c;实现前后端交互 前言一、JDBC 核心接口和类&#xff1a;数据库连接的“工具箱”1. 常用的 2 个“关键类”2. 必须掌握的 5 个“核心接口” 二、创建 JDBC 程序的步骤1. 第一步&#xf…

数据库未正常关闭后,再次启动时只有主进程,数据库日志无输出

瀚高数据库 目录 环境 症状 问题原因 解决方案 环境 系统平台&#xff1a;银河麒麟svs&#xff08;X86_64&#xff09; 版本&#xff1a;4.5.8 症状 现象&#xff1a;使用pg_ctl stop停止数据库&#xff0c;未正常关闭&#xff1b;使用pg_ctl stop -m i 强制关闭数据库后&…

Oracle Recovery Tools修复ORA-00742、ORA-600 ktbair2: illegal inheritance故障

接到客户反馈,一套运行在虚拟化平台中的Oracle数据库,由于机房断电,导致数据库无法启动,最初启动报错 2025-04-22T16:59:48.92222708:00 Completed: alter database mount exclusive alter database open 2025-04-22T16:59:52.60972608:00 Ping without log force is disabled:…

基于 Netmiko 的网络设备自动化操作

学习目标 掌握 Netmiko 库的核心功能与使用场景。能够通过 Netmiko 连接多厂商设备并执行命令和配置。实现批量设备管理、配置备份与自动化巡检。掌握异常处理、日志记录与性能优化技巧。理解 Netmiko 在自动化运维体系中的角色。 1. Netmiko 简介 1.1 什么是 Netmiko Netmi…

LeNet5 神经网络的参数解析和图片尺寸解析

1.LeNet-5 神经网络 以下是针对 LeNet-5 神经网络的详细参数解析和图片尺寸变化分析&#xff0c;和原始论文设计&#xff0c;通过分步计算说明各层的张量变换过程。 经典的 LeNet-5架构简化版&#xff08;原始论文输入为 32x32&#xff0c;MNIST 常用 28x28 需调整&#xff09…

Axure大屏可视化模板:多领域数据决策的新引擎

在数据驱动决策的时代&#xff0c;Axure大屏可视化模板凭借交互性与可定制性&#xff0c;成为农业、园区管理、智慧城市、企业及医疗领域的创新工具&#xff0c;助力高效数据展示与智能决策。 核心应用场景 1. 农业精细化&#xff1a;实时监控土壤湿度、作物生长曲线&#x…

代码随想录算法训练营第60期第十七天打卡

今天我们继续进入二叉树的下一个章节&#xff0c;今天的内容我在写今天的博客前大致看了一下部分题目难度不算大&#xff0c;那我们就进入今天的题目。 第一题对应力扣编号为654的题目最大二叉树 这道题目的坑相当多&#xff0c;我第一次题目没有看明白就是我不知道到底是如何…

SOC估算:开路电压修正的安时积分法

SOC估算&#xff1a;开路电压修正的安时积分法 基本概念 开路电压修正的安时积分法是一种结合了两种SOC估算方法的混合技术&#xff1a; 安时积分法&#xff08;库仑计数法&#xff09; - 通过电流积分计算SOC变化 开路电压法 - 通过电池电压与SOC的关系曲线进行校准 方法原…

使用 SSE + WebFlux 推送日志信息到前端

为什么使用 SSE 而不使用 WebSocket, 请看 SEE 对比 Websocket 的优缺点。 特性SSEWebSocket通信方向单向&#xff08;服务器→客户端&#xff09;双向&#xff08;全双工&#xff09;协议基于 HTTP独立协议&#xff08;需 ws:// 前缀&#xff09;兼容性现代浏览器&#xff08…

二叉树的遍历(广度优先搜索)

二叉树的第二种遍历方式&#xff0c;层序遍历&#xff0c;本质是运用队列对二叉树进行搜索。 层序遍历是指将二叉树的每一层按顺序遍历&#xff0c;通过队列实现就是先将根节点push入队&#xff0c;统计此时的队列中的元素数量size&#xff0c;将size元素全部pop出去&#xff0…

2025年计算机视觉与智能通信国际会议(ICCVIC 2025)

2025 International Conference on Computer Vision and Intelligent Communication 一、大会信息 会议简称&#xff1a;ICCVIC 2025 大会地点&#xff1a;中国杭州 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等 二、会议简介 2025年计算机视觉与智能通…

手工收集统计信息

有时想对某些表收集统计信息 CREATE OR REPLACE PROCEDURE GATHER_STATS ASDECLAREV_SQL1 VARCHAR(1000);--表游标CURSOR C1 ISSELECT (SELECT USER) AS TABLE_OWNER,TABLE_NAMEFROM USER_TABLES; --可以在这里加过滤条件--索引游标CURSOR C2 ISSELECT TABLE_OWNER,INDEX_NAM…

flume整合Kafka和spark-streaming核心编程

flume整合Kafka 需求1&#xff1a;利用flume监控某目录中新生成的文件&#xff0c;将监控到的变更数据发送给kafka&#xff0c;kafka将收到的数据打印到控制台&#xff1a; 1.查看topic 2.编辑flume-Kafka.conf&#xff0c;并启动flume 3.启动Kafka消费者 4.新增测试数据 5.查…

EDI 如何与 ERP,CRM,WMS等系统集成

在数字化浪潮下&#xff0c;与制造供应链相关产业正加速向智能化供应链转型。传统人工处理订单、库存和物流的方式已难以满足下单客户对响应速度和数据准确性的严苛要求。EDI技术作为企业间数据交换的核心枢纽&#xff0c;其与ERP、CRM、WMS等业务系统的深度集成&#xff0c;成…

面试踩过的坑

1、 “”和equals 的区别 “”是运算符&#xff0c;如果是基本数据类型&#xff0c;则比较存储的值&#xff1b;如果是引用数据类型&#xff0c;则比较所指向对象的地址值。equals是Object的方法&#xff0c;比较的是所指向的对象的地址值&#xff0c;一般情况下&#xff0c;重…

多物理场耦合低温等离子体装置求解器PASSKEy2

文章目录 PASSKEy2简介PASSKEY2计算流程PASSKEy2 中求解的物理方程电路模型等离子体模型燃烧模型 PASSKEy2的使用 PASSKEy2简介 PASSKEy2 是在 PASSKEy1 的基础上重新编写的等离子体数值模拟程序。 相较于 PASSKEy1&#xff0c; PASSKEy2 在具备解决低温等离子体模拟问题的能力…