当前位置: 首页 > news >正文

LoadMoreSelect触底加载与远程搜索

       使用方法//父组件<el-form-itemclass="form-condition":label="$t('privacyPolicy.userId')"prop="userNo"><LoadMoreSelectv-model="detailForm.userNo":fetchOptions="fetchStockLocationUserNoData"keyField="value" //绑定的keylabelField="label" // label 自定义名称valueField="value" // value 自定义名称:page="this.selectPage.pageIndex" //页码:pageSize="this.selectPage.pageSize" //数量/></el-form-item>import LoadMoreSelect from '@/components/LoadMoreSelect/LoadMoreSelect.vue';components: { LoadMoreSelect },methods: {async fetchStockLocationUserNoData({ pageIndex, pageSize, query }) {const response = await qryUserId({pageIndex,pageSize,info: query,isDeleted: 0 //自定义参数});return response;},
}
main.js
Vue.directive('loadmore', {bind(el, binding) {// 获取element-ui定义好的scroll盒子let select_dom = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap');select_dom.addEventListener('scroll', function () {const CONDITION = this.scrollHeight - this.scrollTop <= this.clientHeight;if (CONDITION) {binding.value();}});}
});
<template><el-selectv-model="internalValue":popper-append-to-body="false"@change="handleChange":placeholder="$t('placeholder.select')":loading="loading"v-loadmore="handleLoadMore"filterableremote:remote-method="(query) => loadOptions(page, pageSize, query, false)"><!-- @visible-change="visibleChange" --><el-optionv-for="item in options":key="item[keyField]":label="item[labelField]":value="item[valueField]"></el-option><ElSelectLoading :hasMore="hasMore" /></el-select>
</template><script>
import ElSelectLoading from './components/ElSelectLoading.vue';
export default {components: {ElSelectLoading},props: {//选中值value: {type: [String, Number],default: ''},placeholder: {type: String,default: ''},//异步请求fetchOptions: {type: Function,required: true},keyField: {type: String,default: 'id'},labelField: {type: String,default: 'label'},valueField: {type: String,default: 'value'},page: {type: Number,default: 1},pageSize: {type: Number,default: 50}},data() {return {internalValue: this.value,options: [],loading: false,hasMore: false,total: 0,query: '',currentPage: 1};},watch: {value(newVal) {this.internalValue = newVal;},internalValue(newVal) {this.$emit('input', newVal);}},mounted() {},methods: {async loadOptions(page, pageSize, query, isloadmore) {if (query !== '') {this.query = query;// if (this.loading) {//   return;// }if (!isloadmore) {this.loading = true;}try {const res = await this.fetchOptions({ page, pageSize, query });console.log(res, 'fetchOptions');const list = res.data || [];this.total = res.total;if (isloadmore) {this.options.push(...list);} else {this.options = list;}} catch (error) {console.error(error);} finally {this.loading = false;}}},handleLoadMore() {// 请求后端数据并加入分页this.currentPage = this.currentPage + 1;if (this.currentPage > Math.ceil(this.total / 50)) {this.hasMore = false;return;}this.hasMore = true;this.loadOptions(this.currentPage, this.pageSize, this.query, true);},handleChange(value) {this.internalValue = value;this.$emit('change', value);}}
};
</script><style scoped lang="scss"></style>
<template><el-option ref="el" class="el-select-loading" value=""><template v-if="hasMore"><el-icon class="el-icon-loading"></el-icon><span class="el-select-loading__tips">{{ $t('common.loading') }}</span></template><template v-else>{{ $t('common.Nodata') }}</template></el-option>
</template><script>
export default {name: 'LoadMoreSelectOption',props: {// 是否有更多数据可加载hasMore: {type: Boolean,required: false}},data() {return {};},mounted() {},beforeDestroy() {},methods: {}
};
</script><style scoped lang="scss">
.el-select-loading {display: flex;align-items: center;justify-content: center;cursor: initial;pointer-events: none;background-color: rgb(255, 255, 255);// color: #7fb8f2;color: #4d4d4d;font-size: 12px;&__icon {font-size: 16px;animation: rotate 1.5s linear infinite;}&__tips {margin-left: 6px;}@keyframes rotate {from {transform: rotate(0deg);}to {transform: rotate(360deg);}}
}
</style>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 图神经网络实战(16)——经典图生成算法
  • 个人博客|PHP源码|支持多国语言切换
  • 【Spring Cloud】微服务的简单搭建
  • Postgres JSON字段怎么修改key的名称
  • Spring框架的学习SpringMVC(1)
  • Open3D 删除点云中重叠的点(方法二)
  • 提升效能:Symfony 性能优化实用指南
  • 【MYSQL】InnoDB引擎为什么选可重复读作为默认隔离级别
  • 多粒度封锁-封锁粒度、多粒度封锁模式
  • 运维---关于服务治理Nacos的快问快答
  • 《梦醒蝶飞:释放Excel函数与公式的力量》8.3 COUNTBLANK函数
  • win7系统快速安装python
  • pnpm的坑
  • 基于FPGA的DDS信号发生器
  • 运维系列.Nginx配置中的高级指令和流程控制
  • 【391天】每日项目总结系列128(2018.03.03)
  • 2017-09-12 前端日报
  • AHK 中 = 和 == 等比较运算符的用法
  • EOS是什么
  • Github访问慢解决办法
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JavaScript对象详解
  • Leetcode 27 Remove Element
  • mac修复ab及siege安装
  • Mithril.js 入门介绍
  • Next.js之基础概念(二)
  • SOFAMosn配置模型
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 电商搜索引擎的架构设计和性能优化
  • 多线程事务回滚
  • 浮动相关
  • 理清楚Vue的结构
  • 利用jquery编写加法运算验证码
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 使用parted解决大于2T的磁盘分区
  • 怎么将电脑中的声音录制成WAV格式
  • ![CDATA[ ]] 是什么东东
  • # 达梦数据库知识点
  • #define 用法
  • #Linux(make工具和makefile文件以及makefile语法)
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $.ajax中的eval及dataType
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (13):Silverlight 2 数据与通信之WebRequest
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (八十八)VFL语言初步 - 实现布局
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)换源+apt-get基础配置+搜狗拼音
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (转)创业的注意事项
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .a文件和.so文件
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑