【前端】ElementUi 下拉框数据分页多选跨页回显

【前端】ElementUi 下拉框数据分页多选跨页回显

<template>
  <div>
    <el-select
      v-model="selectedOptions"
      multiple
      placeholder="请选择"
      @visible-change="handleVisibleChange"
      class="custom-select"
      popper-class="select-popover-class"
      @change="selectedOptionsChange"
    >
      <!-- 自定义内容 -->
      <template v-slot="dropdown" >
        <!-- 搜索框 -->
        <el-input
          v-model="searchQuery"
          placeholder="请输入搜索内容"
          clearable
        >
          <el-button slot="append" icon="el-icon-search" @click="search" size="small" >搜索</el-button>
        </el-input>

        <!-- 滚动的选项区域 -->
        <div class="options-container">
          <el-checkbox
            :value="checkboxValue"
            :indeterminate="indeterminate"
            @change="checkboxSelectAll"
          >全选</el-checkbox>
          <el-option
            v-for="item in allOptions"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          >
            <el-checkbox :value="selectedOptions.includes(item.value)" @change="itemCheckboxClick(item)" :label="item.label"></el-checkbox>
          </el-option>
        </div>

        <!-- 分页部分,固定到底部 -->
        <div class="pagination-container">
          <el-pagination
            background
            layout="prev, pager, next"
            :current-page="currentPage"
            :page-size="pageSize"
            :total="total"
            @current-change="handlePageChange"
          />
        </div>
      </template>
    </el-select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedOptions: [],  // 已选择的选项
      allOptions: [],       // 所有可选项
      total: 0,             // 总条目数
      currentPage: 1,       // 当前页数
      pageSize: 10,          // 每页显示条目数
      searchQuery: '',      // 搜索关键字
    };
  },
  create(){

  },

  computed:{

    //是否为全选状态
    checkboxValue() {
      if(this.selectedOptions.length && this.allOptions.length){
        for (let i = 0; i < this.allOptions.length; i++) {
          let allObj = this.allOptions[i];
          let allObjVal = allObj.value
          if(this.selectedOptions.includes(allObjVal)){
            //包含
          }else{
            //不包含
            return false;
          }
        }
        return true;
      }
      return false;
    },
    //是否为半选状态
    indeterminate() {
      if(this.selectedOptions.length && this.allOptions.length){
        let 是否存在包含 = false
        let 是否存在不包含 = false
        for (let i = 0; i < this.allOptions.length; i++) {
          let allObj = this.allOptions[i];
          let allObjVal = allObj.value
          if(this.selectedOptions.includes(allObjVal)){
            //包含
            是否存在包含 = true
          }else{
            //不包含
            是否存在不包含 = true
          }
        }
        if(是否存在包含 && 是否存在不包含){
          return true;
        }
      }
      return false;
    }
  },

  methods: {

    //下拉框选中的事件
    selectedOptionsChange(){
      if(this.selectedOptions.length){
        //去重
        const uniqueArr = [...new Set(this.selectedOptions)];
        this.selectedOptions = uniqueArr
      }
    },

    //单选框点击事件
    itemCheckboxClick(item){
      let val = item.value
      if(this.selectedOptions.includes(val)){
        //存在则删除
        let tmpSelectedOptions = []
        //取消选中
        for (let i = 0; i < this.selectedOptions.length; i++) {
          let selectObjVal = this.selectedOptions[i];
          if(val !== selectObjVal){
            //不存在则添加进去
            tmpSelectedOptions.push(selectObjVal);
          }
        }
        this.selectedOptions = tmpSelectedOptions;
      }else{
        //不存在则添加
        this.selectedOptions.push(val);
      }
    },
    checkboxSelectAll(bool) {
      // console.log('监听全选或反选事件', bool)
      if(this.allOptions.length<=0){
        return false;
      }
      if(bool){
        for (let i = 0; i < this.allOptions.length; i++) {
          let allObj = this.allOptions[i];
          let allObjVal = allObj.value;
          //判断是否已经选中了
          if(!this.selectedOptions.includes(allObjVal)){
            //不存在则添加进去
            this.selectedOptions.push(allObjVal)
          }
        }
      }else{
        let tmpSelectedOptions = []
        //取消选中
        for (let i = 0; i < this.selectedOptions.length; i++) {
          let selectObjVal = this.selectedOptions[i];
          let 是否存在 = false;
          for (let j = 0; j < this.allOptions.length; j++) {
            let allObjVal = this.allOptions[j].value
            if(allObjVal === selectObjVal){
              是否存在 = true
              break;
            }
          }
          if(是否存在 === false){
            //不存在则添加进去
            tmpSelectedOptions.push(selectObjVal);
          }
        }
        this.selectedOptions = tmpSelectedOptions;
      }
      return true;
    },

    重置参数(){
      // this.allOptions = [];
      // this.total = 0;
      this.currentPage = 1;
      this.searchQuery = '';
    },
    模拟调用接口返回数据(){
      //这里调用服务端接口, 将分页参数 以及搜索条件传过去
      let arr = []
      //模拟数据
      for (let i = 1; i <= this.pageSize; i++) {
        arr.push({value:"value-"+this.currentPage+'-'+i, label:"名称-"+this.currentPage + '-'+i})
      }
      let 模拟接口数据 = {total:100, data:arr};
      return 模拟接口数据;
    },
    //加载数据
    loadData(){
      let 模拟接口数据 = this.模拟调用接口返回数据()
      this.allOptions = 模拟接口数据.data
      this.total = 模拟接口数据.total;    // 更新总数
    },
    // 分页切换时触发
    handlePageChange(page) {
      this.currentPage = page;
      this.loadData();  // 更新当前页显示的数据
    },
    // 搜索功能处理
    search() {
      alert('点击搜索按钮')
      this.loadData();
    },
    // 下拉框展开时触发
    handleVisibleChange(visible) {
      if (visible) {
        this.重置参数();
        // alert('下拉框展开时触发')
        this.loadData();  // 模拟加载数据
      }else{
        // alert('下拉框关闭时触发')
      }
    }
  }
};
</script>

<style>
/* 覆盖 Element UI 的默认样式 */
.el-select-dropdown__wrap {
  max-width: 98% !important;
  max-height: 100% !important; /* 使用 !important 确保优先级 */
  overflow-y: auto;
  margin-right: 0px;
}

.el-select-dropdown__list {
  padding: 6px 10px !important;
}

.scroll-wrapper {
  max-width: 100% !important;
  position: relative;
  max-height: 100% !important; /* 根据需要调整高度 */
  overflow: hidden; /* 隐藏滚动条 */
}


/* 控制全选按钮样式 */
.select-popover-class .el-scrollbar__view > .el-checkbox{
  padding: 5px 20px;
}

/* 取消多选框触发事件 */
.select-popover-class .el-scrollbar__view > li .el-checkbox {
  pointer-events: none;
}

/* 隐藏多选框选中勾选样式 √ */
.select-popover-class .el-scrollbar__view > li::after {
  display: none;
}



</style>

<style scoped>

/* 搜索框的样式 */
.el-input {
  width: 100%;
  margin-bottom: 10px;
}

/* 可滚动的选项区域 */
.options-container {
  width: 100%;
  max-height: 900px !important; /* 设置一个合适的高度来滚动 */
  overflow-y: auto;
}

/* 分页部分固定在底部 */
.pagination-container {
  position: relative;
  bottom: 0;
  left: 0;
  width: 100%;
  padding: 10px;
  border-top: 1px solid #ebeef5;
  background-color: #fff;
  text-align: center;
}
</style>

猜你喜欢

转载自blog.csdn.net/G971005287W/article/details/143326970