element-plus 下拉框下拉加载更多数据

1.select.vue

<el-select
v-model="searchParams.class_id"
placeholder="班级名称"
:clearable="true"
:filterable="true"
:filter-method="classesFilter"
v-load-more="loadClasses"
@change="classesChange"
@visible-change="classesVisibleChange"
>
  <el-option
  v-for="item in classesData"
  :key="item.class_id"
  :label="item.class_name"
  :value="item.class_id"
  />
</el-select>
const classesPage = ref(1);
const classes = ref();
const loadingClasses = ref(false);
const classesCount = ref(0);
const getClassesData = async() = > {
    loadingClasses.value = true;
    const query = {
        page: classesPage.value,
        page_size: 10,
        class_name: classes.value,
    };
    const {
        ok, data
    } = await classesApi.value(query, {
        'saas-slug': slug.value
    });
    if (ok) {
        classesCount.value = Math.ceil(data.count / 10);
        classesData.value = [...classesData.value, ...data.results];
    }
    loadingClasses.value = false;
};
const classesFilter = (val: string) = > {
    if (val) {
        searchParams.class_id = undefined;
        handleClasses(val);
    }
};
const classesVisibleChange = () = > {
    if (!searchParams.class_id && classes.value) {
        searchParams.class_id = classesData.value[0].class_id;
    }
};
const loadClasses = () = > {
    if (!loadingClasses.value && classesPage.value < classesCount.value) {
        classesPage.value++;
        getClassesData();
    }
};
const classesChange = (val: string) = > {
    if (!val) {
        handleClasses();
    }
};
const handleClasses = (val ? : string) = > {
    classes.value = val;
    classesPage.value = 1;
    classesData.value = [];
    getClassesData();
};

2.自定义指令v-load-more

export default function (app) {
  app.directive('load-more', {
    updated(el, binding) {
      const trigger = el.querySelector('.select-trigger');
      const id = trigger.getAttribute('aria-describedby');

      if (id) {
        const popper = document.getElementById(id);
        const SELECT_WRAP = popper.querySelector('.el-scrollbar .el-select-dropdown__wrap');

        // 这里不能使用箭头函数!
        SELECT_WRAP.addEventListener('scroll', function () {
          /**
           * scrollHeight 获取元素内容高度(只读)
           * scrollTop 获取或者设置元素的偏移值,
           *  常用于:计算滚动条的位置, 当一个元素的容器没有产生垂直方向的滚动条, 那它的scrollTop的值默认为0.
           * clientHeight 读取元素的可见高度(只读)
           * 如果元素滚动到底, 下面等式返回true, 没有则返回false:
           * ele.scrollHeight - ele.scrollTop === ele.clientHeight;
           */
          // 提前1个元素加载数据
          const CONDITION = this.scrollHeight - this.scrollTop - 34 < this.clientHeight;
          if (CONDITION) {
            binding.value();
          }
        });
      }
    },
  });
}

 参考链接:https://www.jianshu.com/p/35cca807031c

posted @ 2023-01-12 16:57  放飞的回忆  阅读(1247)  评论(0)    收藏  举报