由于用 input 实现下拉分页不太理想,转换了一个角度,用 select 实现,以下是具体实现(script-setup TS)

script-setup

<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({ name: 'LabelSelectCpm' })
</script> <script setup lang="ts">
import { ref, reactive } from 'vue'
// const emit = defineEmits([]) // select 绑定的 v-model
const value = ref()
const searchKeyword = ref()
//dom 事件节点
const dom = ref()
const loading = ref(false)
// select-options 数据源
const options = ref([])
// 分页控制
const requsetObj = reactive({
page: 1,
size: 50,
}) /**
* 加载接口数据
* @return Promise
*/
const loadData = async () => {
return new Promise((res, rej) => {
setTimeout(() => {
res(
Array.from(
{ length: requsetObj.size * requsetObj.page },
(v, i) => ({ label: `label${i}`, value: `value${i}` })
)
)
}, 300)
})
} /**
* @param {string} query 输入的搜索关键词
* @param {function} fn 需要在接口数据返回后执行的回调
*/
const remoteMethod = (query: string, fn?: Function) => {
loading.value = true
if (query) {
/* 记录输入的关键词 */
searchKeyword.value = query
loadData().then((res: any) => {
console.log(res)
options.value = res
loading.value = false
fn && fn()
})
} else {
/* 初始化数据逻辑 */
loadData().then((res: any) => {
console.log(res)
options.value = res
loading.value = false
fn && fn()
})
}
} const selectChange = (val: any) => {
const selectVal = options.value.filter((e: any) => e.value == val)
console.log('当前选中', selectVal)
} /* 滚动监听函数 */
const scrollAddEventFn = (e) => {
const self = e.target as any
if (self.scrollHeight - self.scrollTop <= self.clientHeight) {
console.log('分页查询')
requsetObj.page++
remoteMethod(searchKeyword.value)
}
}
const visibleChange = (isShow: any) => {
if (isShow) {
// 下拉框显示时,渲染数据,初始化滚动监听
remoteMethod(searchKeyword.value, () => {
/* 在数据渲染完之后的回调 */
/* 初始化滚动监听 (由于 dom 渲染未完成,所以需要开启一个 timeout 在 1s 后实现监听) */
const parentDom = document.querySelectorAll(
'.el-select-dropdown__wrap.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default'
) as any
setTimeout(() => {
parentDom.forEach((e: any, idx: number) => {
if (
e.querySelector('.LabelSelectCpmBox') &&
e.querySelector('.LabelSelectCpmBox').children &&
e.querySelector('.LabelSelectCpmBox').children.length >
0
) {
dom.value = parentDom[idx]
dom.value.addEventListener(
'scroll',
scrollAddEventFn,
false
)
}
})
}, 1000)
})
} else {
// 移除滚动监听
dom.value?.removeEventListener('scroll', scrollAddEventFn, false)
options.value = []
}
}
</script>

template

<template>
<div class="LabelSelectCpm">
<el-select
v-model="value"
:multiple="false"
filterable
remote
reserve-keyword
placeholder="输入关键词搜索"
:remote-method="remoteMethod"
@change="selectChange"
@visible-change="visibleChange"
:loading="loading"
>
<div class="LabelSelectCpmBox">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</div>
</el-select>
</div>
</template>

css 没有额外的代码,所以就不贴了

Vue3 element-plus 下拉分页 select分页的更多相关文章

  1. easyui combogrid下拉表格的分页/按键/动态搜索

    作者:xfl4629712  <  easyui combogrid下拉表格的分页/按键/动态搜索  > 需求: 1.下拉框下拉时出现表格: 2.表格带分页功能: 3.可以使用向上键.向下 ...

  2. jQuery对下拉框Select操作总结

    jQuery对下拉框Select操作总结 转自网络,留做备用 jQuery获取Select元素,并选择的Text和Value: 1. $("#select_id").change( ...

  3. struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input

    原文地址:struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input jsp页面 1     function dosearch() {2         if ($(&q ...

  4. JQuery操作下拉框 select

    要实现这种效果: html代码 1<script src="js/jquery-1.7.2.min.js"></script> 2 <table> ...

  5. 下拉框select中option居中样式

    下拉框select中option居中样式 text-align:center;text-align-last:center;

  6. 下拉框 select

    1.select 用来做什么? select 用于实现下来下拉列表,其 html 结构是这样的: <select name="city" id="city" ...

  7. 下拉菜单select高度(兼容IE6/IE7/IE8/火狐等主流浏览器)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 【jQuery获取下拉框select、单选框radio、input普通框的值和checkbox选中的个数】

    radio单选框:name属性相同 <input type="radio" id="sp_type" name="p_type" va ...

  9. 第三方 XListview 上拉加载、下拉刷新、分页加载和Gson解析

    注意:此Demo用的是第三方的Xlistview.jar,需要复制me文件夹到项目中,两个XML布局文件和一张图片 把下面的复制到String中 <string name="xlist ...

  10. Selenium下拉菜单(Select)的操作-----Selenium快速入门(五)

    对于一般元素的操作,我们只要掌握本系列的第二,三章即可大致足够.对于下拉菜单(Select)的操作,Selenium有专门的类Select进行处理.文档地址为:http://seleniumhq.gi ...

随机推荐

  1. opengl编程天天踩的坑

    1. VBO 的 target 是 GL_ARRAY_BUFFER 不是  GL_VERTEX_BUFFER 2. glUniform()用来给uniform传变量 别用成 glProgramUnif ...

  2. Asp.net MVC5中没有BundleConfig.cs-MVC学习笔记(一)

    创建ASP.NET MVC5项目时,选择了空项目,在App_Start文件夹中没有默认创建了BudleConfig.cs文件. 下面就来手动添加 在NuGet中搜索Microsoft.AspNet.W ...

  3. mysql 设置查询超时配置

    mysql设置查询超时 mysql5.6: max_statement_time (毫秒) mysql5.7: max_execution_time(毫秒) mariadb: max_statemen ...

  4. React支持less操作

    React支持less操作 1.执行暴漏命令 npm run eject 2.输入" Y " 确认 这时候发现config文件夹没暴漏出来,是因为git没有暂存,得执行如下命令: ...

  5. Go_day05

    Go基础语法 OOP面向对象 Go语言本身不是面向对象的语言,但是可以通过一些方法来模拟对象 面向对象的思维就是分类思维 继承 // 定义一个父类结构体 type Person struct { na ...

  6. vsftpd2.3.4 后门笑脸漏洞

    漏洞概要 在vsftpd 2.3.4版本中,在登录输入用户名时输入:)类似于笑脸的符号,会导致服务处理开启6200后门端口,直接执行系统命令 漏洞利用 攻击机:kali 2022 msfconsole ...

  7. 关于报出这样的错误:org.apache.catalina.core.StandardWrapperValve.invoke 在路径为/tt1016_war_exploded的上下文中,Servlet[Servlet.m的解决方法

    从23:30开始报错检查,现在才弄好,发出来分享一下 错误界面: 首先,我们需要检查一下我们利用DBUtil.java文件中引用的db文件名称是否正确,(我就是因为没有注意到文件名称是否正确报出500 ...

  8. SpringBoot使用邮件发送

    使用场景: 定时任务报错 消息推送 日志报错提醒 1.导入依赖 <dependency> <groupId>org.springframework.boot</group ...

  9. NewStarCTF 公开赛 2022 RE WP

    Week 2 Re 前可见古人,后得见来者 chipher = [0x51, 0x5B, 0x4C, 0x56, 0x59, 0x4D, 0x50, 0x56, 0x54, 0x43, 0x7D, 0 ...

  10. Java中的String类真的不可变吗?java面试常见问题

      其实在Java中,String类被final修饰,主要是为了保证字符串的不可变性,进而保证了它的安全性.那么final到底是怎么保证字符串安全性的呢?接下来就让我们一起来看看吧. 一. final ...