vue.js2.x + elementui2.15.6实现el-select滚动条加载数据

版本:vue.js elementui2.15.6

实现效果:滑动下拉菜单时,自动请求数据库数据

核心思路:对下拉菜单div的scroll事件进行监听,事件触发时发送请求

html 复制代码
<template>
  <div id="SelectSearchPage" class="infinite-scroll-select">
    <span>功能名称或需求列表:</span>
    <!--popper-class定义下拉框class,方便获取div-->
    <el-select v-model="selectedValue" placeholder="请选择" filterable remote :loading="loading" clearable style="width: 300px;" ref="mySelect"
               @visible-change="handleVisibleChange"
               @change="change"
               :remote-method="handleSearch"
               popper-class="select-search-page-dropdown-popper"
    >
      <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id" />
    </el-select>
  </div>

</template>

注意:popper-class="select-search-page-dropdown-popper"定义下拉框class,方便取DIV,否则同时有多个下拉展示时不知道数据那个下拉。

javascript 复制代码
import message from 'element-ui/packages/message'
export default {
  name: 'SelectSearchPage',
  props: {

  },
  data() {
    return {
      selectedValue: '',
      options: [],
      loading: false,
      loadingMore: false,
      // 分页参数
      page: 1,
      pageSize: 10,
      total: 0,
      hasMore: true,
      keyword: '',
      scrollListener: null
    };
  },

  mounted() {
    this.requestData('',true)
  },

  methods: {

    // 加载数据
    async requestData(queryValue,resetPage = true) {
      if (resetPage) {
        this.page = 1;
        this.hasMore = true;
        this.loading = true;
      } else {
        this.loadingMore = true;
      }

      try {
        const params = {
          pageNo: this.page,
          pageSize: this.pageSize,
          name: queryValue
        };

        const response = await findNameList(params);
        if(response.code===200){
          const data = response.data
          if (resetPage) {
            this.options = data.records;
          } else {
            this.options = [...this.options, ...data.records];
          }

          this.total = data.total;
          this.hasMore = this.page * this.pageSize < data.total;
        }


      } catch (error) {
        console.error('加载失败:', error);
      } finally {
        this.loading = false;
        this.loadingMore = false;
      }
    },
    change(){
      this.$emit("change",this.selectedValue);
    },
   handleVisibleChange(visible){
      // const selectSearchPage = document.getElementById("SelectSearchPage");
     const dom = document.querySelector(".select-search-page-dropdown-popper").querySelector(".el-scrollbar").querySelector(".el-scrollbar__wrap")
     if(!visible){
       dom.removeEventListener("scroll",this.scrollEvent);
     }
     dom.addEventListener("scroll",this.scrollEvent)
   },
    scrollEvent(event){
      // console.log('滑动事件被触发,',event);
      const domTarget =event.target
      const scrollTop = domTarget.scrollTop
      const clientHeight =domTarget.clientHeight
      const scrollHeight = domTarget.scrollHeight
      const scrollBottom = scrollHeight - clientHeight - scrollTop;
      console.log('scrollTop: ',scrollTop,',clientHeight:',clientHeight,',scrollHeight:',scrollHeight,',距离底部距离:',(scrollHeight - clientHeight - scrollTop));
      if(scrollBottom <=20){
        this.page++;
        if(this.hasMore) {
          this.requestData(this.keyword, false)
        }else{
          message({ message: `数据已加载完毕`, type: 'success', })
        }
      }
    },

    // 搜索
    handleSearch(query) {
      this.keyword = query
      this.requestData(query,true);
    },
  }
}
相关推荐
成都渲染101云渲染66662 小时前
如何在3ds Max中实现更快、更高质量的渲染
前端·javascript·人工智能
闲猫4 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
paopaokaka_luck5 小时前
英语单词学习系统的设计与实现(基于艾宾浩斯遗忘曲线的智能复习机制、语音朗读、多题型测试与错题自动收录、Echarts图形化分析)
vue.js·spring boot·后端·echarts
自信的未来6 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
SRET6 小时前
Mineradio 沙盒隔离安装完全指南 | 一键安全运行 Electron 应用!!!
javascript·经验分享·安全·electron·aigc·音视频·ai编程
全栈前端老曹6 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
zhangxingchao7 小时前
AI大模型核心八:从 Agent Skill、长文档 RAG 到知识库更新与训练策略
前端·人工智能·后端
zhangxingchao7 小时前
AI大模型核心七:从 Workflow、RAG、记忆治理到幂等性
前端·人工智能·后端
gyx_这个杀手不太冷静8 小时前
Agent开发进阶指南(第 1 章):AI Agent 到底是什么?
前端·agent·ai编程
小小小小宇8 小时前
模型相关知识
前端