当下拉框需要展示的数据有很多时,几千甚至上万条,一次性全部请求回来再按照特定格式比如 id-name 去处理数据的话,不论是从接口还是前端,这个性能都不是很好,会造成下拉框初次打开时响应很慢,影响用户体验。

于是想给下拉框做一个类似分页请求的功能,目前使用的是element-ui,只有提供远程搜索功能,没有触底加载相关指令,所以准备写一个自定义指令。

Vue自定义指令简介:

除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。

注册自定义指令的两种方式:全局注册和局部注册,两种方式我都会演示一遍

一、全局注册

 1 Vue.directive('loadmore', {
2 inserted: function (el, binding) {
3 const dom = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap'); // 获取下拉框元素
5 dom.addEventListener('scroll', function () { // 监听元素触底
6 const condition = this.scrollHeight - this.scrollTop <= this.clientHeight;
8 if (condition) {
9 binding.value();
10 }
11 });
12 }
13 })

二、局部注册

 1 export default {
2 directives: { // 在组件中接受一个 directives 的选项
3 loadmore: {
4 inserted(el, binding) {
5 const dom = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap'); // 获取下拉框元素
6 dom.addEventListener('scroll', function () { // 监听元素触底
7 const condition = this.scrollHeight - this.scrollTop <= this.clientHeight;
8 if (condition) {
9 binding.value();
10 }
11 });
12 },
13 },
14 },
15 }

使用方法:

不论全局注册还是局部注册之后,使用方式都是一样的,与v-model、v-if之类指令一致

<template>
<el-select v-model="value" placeholder="请选择" v-loadmore="loadmore"> // 使用指令绑定事件
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</template> <script>
export default {
methods:{
loadmore(){
// 当下拉框滚动且触底时,会触发此事件,可以在此处去请求下拉框分页数据
}
}
}
</script>

注:由于el-select有默认最大高度,所以第一页数据需要略微多几条,不然不会出现下拉框滚动条,也就触发不了触底事件。我看了下大概8条数据即可出滚动条

el-select实现下拉框触底加载更多的更多相关文章

  1. 在element-ui的select下拉框加上滚动加载

    在项目中,我们需要运用到很多来自后端返回的数据.有时是上百条,有时甚至上千条.如果加上后端的多表查询或者数据量过大,这就导致在前端的显示就会及其慢,特别是在网络不好的时候更是如此. 自然,后端就做了一 ...

  2. 微信小程序采坑之上拉触底加载更多和下拉刷新

    小程序中加载更多数据一般都是触底刷新 有自带的函数: onReachBottom: function (){} 但是在使用时触发完全没有反应,后来尝试给外层加了一个高度,解决问题 仔细想想也是,没有设 ...

  3. 实现select下拉框的无限加载(懒加载)

    在实际开发中我们有时无法避免select下拉功能数据过大导致页面卡顿(如在我在一次迭代中有一个select项接口返回了5000多条数据).用户体验差!结合实际开发给出了3个解决方案: 方案1.sele ...

  4. combotree -下拉框树异步加载

    问题: 下拉树数据比较多时,全加载会产生页面延迟,需要实现异步加载 方案: 点击事件加载:先加载部分,点击节点时再展开并追加子节点 onBeforeExpand事件:在展开树前加载,感觉这种方式比较优 ...

  5. 转:JQuery实现下拉框的数据加载和联动

    <script type="text/javascript"> $(document).ready(function() { GetByJquery(); $(&quo ...

  6. ajax实现下拉菜单无刷新加载更多

    $(function() { var page = 1; var discount = $('#discount'); var innerHeight = window.innerHeight; va ...

  7. juery下拉刷新,div加载更多元素并添加点击事件(二)

    buffer.append("<div class='col-xs-3 "+companyId+"' style='padding-left: 10px; padd ...

  8. Vue.js中使用select选择下拉框

    在Vue.js中使用select选择下拉框有两种方法: 第一种: Add.html: <select v-model="sysNotice.noticeType" id=&q ...

  9. select change下拉框改变事件 设置选定项,禁用select

    select change下拉框改变事件 设置选定项,禁用select 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio ...

随机推荐

  1. 「题解报告」P7301 【[USACO21JAN] Spaced Out S】

    原题传送门 神奇的5分算法:直接输出样例. 20分算法 直接把每个点是否有牛的状态DFS一遍同时判断是否合法,时间复杂度约为\(O(2^{n^2})\)(因为有判断合法的剪枝所以会比这个低).而在前四 ...

  2. spark 读取hive 计算后写入hive

    package com.grady import org.apache.spark.SparkConf import org.apache.spark.sql.{DataFrame, Row, Spa ...

  3. Base64加密、解密

    #region Base64加密方法 /// <summary> /// Base64加密,采用utf8编码方式加密 /// </summary> /// <param ...

  4. Bugly iOS自动导入符号表

      前言       最近在处理Bugly问题的时候顺便解决了下符号表上传的问题,使用最新的上传工具包,也是顺便整理了下可以使用的脚本添加到了项目中,把这个过程中遇到的问题总结出来,脚本也会给出来,实 ...

  5. 使用MinIO中暂未解决的问题

    时间显示问题 web页面上创建桶的时间跟使用SDK获取的时间不一样,相差8个小时,但是mc命令行客户端获取的时间跟web上的一样

  6. MySQL之pt-query-digest分析慢查询日志的详情介绍

    一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdu ...

  7. elk使用微信ElartAlert企业微信告警,自定义告警内容

    第一种方式 alert: - "elastalert_modules.wechat_qiye_alert.WeChatAlerter" alert_text: " === ...

  8. 8Hello world

    Name=input("请输入你的名字:") print('欢迎你',Name)

  9. vue2.x引入threejs

    @ 目录 vue2.x引入threejs npm安装 使用指定版本: 其他插件 实例 强调 vue2.x引入threejs npm安装 npm install three 使用指定版本: npm in ...

  10. 工厂里懂得mes和erp有发展吗?

    在工厂里懂得MES.ERP肯定有发展啊,现在数字化转型.智能制造正当时,ERP.MES之类的系统是刚需,只是不同工厂启动的早晚有别,使用的系统不相同而已,但知识体系.逻辑.理念等大都是相通的.比如你熟 ...