首页 > 其他分享 >element中select组件加入滚动分页及模糊查询

element中select组件加入滚动分页及模糊查询

时间:2023-11-16 18:55:27浏览次数:40  
标签:el 滚动 自定义 模糊 element 搜索 组件 select

element中select组件加入滚动分页及模糊查询

1.directive.js-自定义vue指令

import Vue from 'vue'
 
export default () => {
  Vue.directive('loadMore', {
    bind (el, binding) {
    //  如上图,我通过v-if来控制了两个select框,当没有binding.arg这个参数时,我只能监听到企业类型下的select框,所以,我通过传参控制了监听的哪个select框
      var className = '.' + binding.arg
      el.className = binding.arg
      // 获取滚动页面DOM
      const SCROLL_DOM = el.querySelector(`${className} .el-select-dropdown .el-select-dropdown__wrap`)
      // const SCROLL_DOM = el.querySelector(“.el-select-dropdown .el-select-dropdown__wrap“)
      SCROLL_DOM.addEventListener('scroll', function () {
        // 当前的滚动位置 减去  上一次的滚动位置
        // 如果为true则代表向上滚动,false代表向下滚动
        const CONDITION = this.scrollHeight - Math.ceil(this.scrollTop) <= this.clientHeight
        // 如果已达到指定位置则触发
        if (CONDITION  && this.scrollTop !== 0) {
          // 将滚动行为告诉组件
          binding.value()
        }
      })
    }
  })
}

2.main.js中引入并注册自定义指令

// 下拉组件滚动查询数据的自定义指令
import Directives from './directives';
Vue.use(Directives)

3.select组件使用自定义指令

<el-select
  v-model="form.tableName"
  placeholder="请选择表名称"
  filterable
  allow-create
  default-first-option
  clearable
  v-loadMore="handleScroll" //使用自定义指令,滚动时触发
  remote //是否为远程搜索
  :remote-method="remoteMethod" //远程搜索的方法
  :loading="dataTableLoading" //加入loading
  @clear="remoteMethod" //清空时重新调用一下接口
>
  <el-option
    v-for="item in selectDataTableList"
    :key="item.tbId"
    :label="item.tableName"
    :value="item.tableName"
  />
</el-select>


methods:{
    //获取下拉数据
    async getTableList(){
      this.tableLoading = true;
      const res = await getTableList({ 
        current: this.datasourcePage,
        size: 20,
        tableName: this.searchTableName
      });
      //滚动分页之后需要叠加之前获取到的数据
      this.selectDataTableList = [...this.selectDataTableList || [], ...res.data.records || []];
      this.selectDataTableTotal = res.data.total;
      this.tableLoading = false;
    },
        
    // 滚动搜索下拉表数据
    handleScroll(){
     //滚动页数增加
      this.datasourcePage++;
     //判断如果数据长度大于总长度就不进行接口调用
      if( this.selectDataTableList.length < this.selectDataTableTotal ){
        this.getDatasourceTableList(this.form.disId || this.editArr?.dataSourceId);
      }
    },
                                    
    // 远程模糊查询下拉表数据
    remoteMethod(val){
      //模糊搜索的时候需要将页数重置;
      this.datasourcePage = 1;
      //将数组重置, 否则模糊搜索查询到的数据会叠加之前没有模糊搜索的数据里面
      this.selectDataTableList = [];
      //设置模糊查询的内容
      this.searchTableName = val;
      //调用接口获取数据
      this.getDatasourceTableList(this.form.disId || this.editArr?.dataSourceId);
    }
}

4.模糊搜索方法2 - filter-method 替代 remote-method

main.js中 全局引入lodash

import _ from 'lodash';
Vue.prototype._ = _;  // 使用 this._.debounce(this.handleClick,1000,false)

修改select组件属性: filter-method ---> 自定义搜索方法

使用  :filter-method="this._.debounce(this.remoteMethod, 1000, false)" //搜索内容的时候进行防抖
代替  remote //是否为远程搜索
     :remote-method="remoteMethod" //远程搜索的方法

该方法好处:编辑回显时,如果当前下拉值在下拉数据中没有,也会显示到下拉列表的数据中(应对业务的奇葩需求)

标签:el,滚动,自定义,模糊,element,搜索,组件,select
From: https://www.cnblogs.com/domin520Jian/p/17837023.html

相关文章

  • element UI (input输入框clearable)不生效问题
    问题:el-input里自带了一个属性clearable,可以清楚输入框内容。但是有的时候清除无效,可能有如下情况:1.clear删除无效,可以绑定clear事件解决,@clear="handleClear";html:<el-form:label-position="labelPosition"label-width="100px":model="form"><el-form-i......
  • iframe本身就不是动态语言,样式和脚本都需要额外导入.iFrame的本质是内联框架的缩写,它
    以下哪个选项的描述是错误的Aiframe是用来在网页中插入第三方页面,早期的页面使用iframe主要是用于导航栏这种很多页面都相同的部分,这样在切换页面的时候避免重复下载Biframe的创建比一般的DOM元素慢了1-2个数量级Ciframe标签会阻塞页面的的加载Diframe本质是动态语言的Inc......
  • vue2组件二次封装
    有时候公共UI组件满足不了一些特定的需求样式,并且有较多地方使用同一个UI组件,这时候就需要考虑二次封装现有UI组件组件二次封装关键的几点:使用$attrs接收props使用$listeners 接收事件使用$slots和$scopedSlots接收插槽使用model定义prop变量及其变化的事件(改变v-mo......
  • docker使用--gpus all报错: docker: Error response from daemon: could not select d
    报错信息:docker:Errorresponsefromdaemon:couldnotselectdevicedriver""withcapabilities:[[gpu]].解决方法:1,任意路径下创建nvidia-container-runtime-script.sh文件vimnvidia-container-runtime-script.sh拷贝下方内容到nvidia-container-runtime-script.......
  • 获取所有指定类名的元素:getElementsByClassName 注意是带s的
    下列不属于javascript中查找元素的方法的是()AgetElementByClassName()BgetElementsByTagName()CgetElementById()DgetElementsByName()正确答案:A选择A错在Elements。因为这个方法可以返回一组节点。A.获取所有指定类名的元素:getElementsByClassNamevarx=documen......
  • BI 数据可视化平台建设(2)—筛选器组件升级实践
    作者:vivo互联网大数据团队-WangLei本文是vivo互联网大数据团队《BI数据可视化平台建设》系列文章第2篇-筛选器组件。本文主要介绍了BI数据可视化平台建设中比较核心的筛选器组件,涉及组件分类、组件库开发等升级实践经验,通过分享一些对交互和业务耦合度高的组件开发迭代的......
  • element menu结构 解释
    在使用element-uiMenu菜单的时候,一开始看很蒙蔽主要是因为这个组件里面有的东西有点多:而且还是嵌套嵌套这样的.整的就很难受.然后我就开始倒腾,一个一个拆解.最后得出结论标签需要放在最外层这个放在这个里层的任何位置,表示子菜单,然后和是配套的,下面解释......
  • 8、Flutter Paddiing组件
    Padding组件处理容器与子元素之间的间距。 classMyAppextendsStatelessWidget{constMyApp({super.key});@overrideWidgetbuild(BuildContextcontext){returnContainer(padding:constEdgeInsets.all(20),child:constIcon(Icons.abc_o......
  • elementui el-upload实现不自动上传,将上传内容放在formData里面,传递给后端
    //这种情况一般是要弹出一个弹框进行上传操作<el-uploadref="upload"action=""name="fileList":show-file-list="false":auto-upload=&qu......
  • 界面组件DevExpress Reporting v23.1亮点 - 全新升级报表查看器
    DevExpressReporting是.NETFramework下功能完善的报表平台,它附带了易于使用的VisualStudio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表界面组件DevExpressReportingv23.1已经发布一段时间了,新版本在报表查看器中拥有新的缩放......