el-select下拉框的选项太多时会卡顿,影响体验,使用下拉框选项分页来解决,即elementUI的分页插件和el-select插件组合使用

效果

我这里有个el-input输入框做模糊查询

<el-select v-model="form.kmdm" style="width: 320px">
                <el-input
                  v-model="inputVal"
                  :clearable="true"
                  v-on:input="filterKm(inputVal)"
                  style="width: 50%"
                  placeholder="科目代码(名称)模糊查询"
                />
                <el-pagination
                  background
                  :page-sizes="[kms.length, 20, 40, 60, 80, 100, 200, 500]"
                  :page-size="pageSize2"
                  layout="total, sizes, prev, pager, next, jumper"
                  :total="kms.length"
                  :current-page.sync="currentPage2"
                  @current-change="onCurrentKms"
                  @size-change="handleSizeChange2"
                  small
                />
                <el-option
                  v-for="(it, index) in selectKms"
                  :key="index"
                  :label="`${it.code}(${it.name})`"
                  :value="it.code"
                ></el-option>
              </el-select>
<script>
import {
  get as httpGet,
} from "@/request";


export default {
  data() {
    return {
      form: {
        kmdm: "",
      },
      allKms: [],//存放后端传到前端的所有数据
      kms: [],//下拉框显示的总数据
      selectKms: [],//下拉框当前页显示的数据
      pageSize2: 20,
      currentPage2: 1,
      inputVal: "",
      rules: {
        kmdm: [
          {
            required: true,
            message: "请选择科目代码(名称)",
            trigger: "change",
          },
        ],
      },
    };
  },
created() {},
methods: {
    handleSizeChange2(size) {
      this.pageSize2 = size;
      this.onCurrentKms(1);
    },
    onCurrentKms(page) {
      this.currentPage2 = page;
      if (this.kms.length > 0) {
        if (page * this.pageSize2 <= this.kms.length) {
          this.selectKms = this.kms.slice(
            (page - 1) * this.pageSize2,
            page * this.pageSize2
          );
        } else {
          this.selectKms = this.kms.slice(
            (page - 1) * this.pageSize2,
            this.kms.length
          );
        }
      } else {
        this.selectKms = [];
      }
    },
   filterKm(value) {
      if (value) {
        this.kms = this.allKms.filter(
          (x) => x.name.includes(value) || x.code.includes(value)
        );
      } else {
        this.kms = this.allKms;
      }
      this.onCurrentKms(1);
    },
};
</script>