• 基于element-plus的选择组件el-select实现下拉加载封装


     在vue3项目当中使用element-plus的UI组件el-select选择器,有时候会用到选择器下拉下载的功能,封装一个指令可以进行这样操作。

    在main.ts 当中封装v-loadmore指令:

    1. app.directive('load-more', {
    2. updated(el, binding) {
    3. const trigger: HTMLElement = el.querySelector('.select-trigger')!;
    4. const id: string = trigger.getAttribute('aria-describedby')!;
    5. if (id) {
    6. const popper: HTMLElement = document.getElementById(id)!;
    7. const selectWrap: HTMLElement = popper.querySelector(
    8. '.el-scrollbar .el-select-dropdown__wrap'
    9. )!;
    10. /**
    11. * scrollHeight 获取元素内容高度(只读)
    12. * scrollTop 获取或者设置元素的偏移值,
    13. * 常用于:计算滚动条的位置, 当一个元素的容器没有产生垂直方向的滚动条, 那它的scrollTop的值默认为0.
    14. * clientHeight 读取元素的可见高度(只读)
    15. * 如果元素滚动到底, 下面等式返回true, 没有则返回false:
    16. * ele.scrollHeight - ele.scrollTop === ele.clientHeight;
    17. */
    18. // 提前1个元素加载数据
    19. selectWrap.addEventListener('scroll', () => {
    20. const { scrollHeight, scrollTop, clientHeight } = selectWrap;
    21. const conditon = scrollHeight - scrollTop - 34 < clientHeight;
    22. if (conditon) {
    23. binding.value();
    24. }
    25. });
    26. }
    27. }
    28. });

    在组件当中使用:

    1. v-model="tokenSymbolVal"
    2. v-bind="$attrs"
    3. v-load-more="handleEcoScroll"
    4. class="w-full"
    5. clearable
    6. filterable
    7. remote
    8. collapse-tags-tooltip
    9. reserve-keyword
    10. :placeholder="$t('eth.selectToken')"
    11. remote-show-suffix
    12. :remote-method="handleRemoteMethod"
    13. :loading="initLoad"
    14. :no-data-text="$t('cross.birdge')"
    15. @visible-change="handleVisibleChange"
    16. @change="handleSelectChange"
    17. @clear="handleSelectClear"
    18. >
    19. <el-option
    20. v-for="item in tokenList.list"
    21. :key="item.ecosystem"
    22. :label="item.tokenSymbol"
    23. :value="String(item.ecosystem)"
    24. >
    25. <div class="flex justify-between items-center">
    26. <span>{{ item.tokenName }}span>
    27. <div class="flex items-center">
    28. <span>
    29. {{ item.balance }}
    30. span>
    31. <span class="ml-1">
    32. {{ item.tokenSymbol }}
    33. span>
    34. div>
    35. div>
    36. el-option>

    加载函数:

    1. const handleEcoScroll = () => {
    2. if (scrollLoad.value) {
    3. return;
    4. }
    5. const totalHistory = tokenList.pageNum.total;
    6. console.log(totalHistory);
    7. const { page } = tokenList.pageNum;
    8. console.log('🚀 ~ file: CrossIn.vue:143 ~ handleEcoScroll ~ page:', page);
    9. const { limit } = objToken.value;
    10. const num = Math.ceil(totalHistory / limit);
    11. console.log(num);
    12. if (num > page) {
    13. objToken.value.page += 1;
    14. console.log(objToken.value.page);
    15. handleTokenList(chainName, objToken.value);
    16. }
    17. };

  • 相关阅读:
    什么是AOP?
    二、SpringBoot自动装配及SPI的理解
    SSM项目【Spring MVC、MyBatis、Spring】传智健康项目,关于检查项页面问题
    RK3399平台开发系列讲解(基础篇)嵌入式编码规范有哪些
    【JQuery_基础练习】基础练习_分析_区分
    如何快速做跨业务测试?
    美团外卖搜索基于Elasticsearch的优化实践
    思迈特软件蝉联IDC中国Fintech 50强,金融科技实力再获认可!
    java your MySQL server version for the right syntax to use near
    关于链表指针的深刻理解
  • 原文地址:https://blog.csdn.net/sinat_36728518/article/details/132316550