当前位置:   article > 正文

vue 下拉列表自定义指令实现懒加载(无限滚动)_el-scrollbar 下拉加载

el-scrollbar 下拉加载

技术栈

  • Vue.js
  • ElementUi 

无限滚动优点

解决dom一次性渲染开销大, 导致浏览器卡顿, 或者内存不足崩溃

无限滚动缺点:

理论上无限滚动数据量达到w级也会逐步开始卡顿, 暂时还没尝试过

针对vue框架做了directive(自定义指令 — Vue.js)的形式开发, 代码如下

  1. // src/directive/lazyLoading.js
  2. function debounce(fn, delay) {
  3. // 防抖
  4. var timeout = null; // 创建一个标记用来存放定时器的返回值
  5. return (e) => {
  6. clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉
  7. // 然后又创建一个新的 setTimeout, 这样就能保证interval 间隔内如果时间持续触发,就不会执行 fn 函数
  8. timeout = setTimeout(() => {
  9. fn.apply(this, arguments);
  10. }, delay);
  11. };
  12. }
  13. export default {
  14. install(Vue) {
  15. Vue.directive("lazyLoading", {
  16. bind(el, binding) {
  17. const { value } = binding;
  18. let elementClass = null;
  19. let lazyFun = null;
  20. if (typeof value == "object") {
  21. const { elementClass: _elementClass, lazyFun: _lazyFun } = value; // elementClass 滚动盒子的class, lazyFun 调用的函数
  22. elementClass = _elementClass;
  23. lazyFun = _lazyFun;
  24. } else if (typeof value == "function") {
  25. lazyFun = value;
  26. } else {
  27. console.err("传参错误");
  28. return;
  29. }
  30. // 获取element-ui定义好的scroll盒子
  31. const SELECTWRAP_DOM = el.querySelector("." + elementClass);
  32. SELECTWRAP_DOM.addEventListener("scroll", function () {
  33. let { clientHeight, scrollTop, scrollHeight } = this;
  34. // 当用户的滚动距离大于等于滚动条的总高度, 就执行lazyFun方法
  35. const CONDITION = Math.ceil(clientHeight + scrollTop) >= scrollHeight;
  36. if (CONDITION) {
  37. debounce(lazyFun(), 300);
  38. }
  39. });
  40. },
  41. });
  42. },
  43. };
  1. // src/main.js 在入口文件引入, vue实例生成前调用
  2. import lazyLoading from "@/directive/lazyLoading";
  3. Vue.use(lazyLoading);
  4. new Vue({
  5. el: "#app",
  6. ...
  7. });
  1. // 页面使用
  2. <el-scrollbar
  3. v-lazy-loading="{
  4. lazyFun: lazyFun,
  5. elementClass: 'el-scrollbar__wrap',
  6. }"
  7. >
  8. ...
  9. </el-scrollbar>
  10. <script>
  11. export default {
  12. data() {
  13. return {
  14. renderNum: 0, //渲染次数
  15. renderList: [], //渲染的数据
  16. };
  17. },
  18. methods: {
  19. // 初始化懒加载数据 从0开始
  20. initLazyFun() {
  21. let count = 5;
  22. this.renderList = this.upList.slice(0, count);
  23. this.renderNum += count;
  24. },
  25. // 更新当前懒加载数据 仅更新renderNum数量, 不继续+count
  26. updateLazyFun() {
  27. this.renderList = this.upList.slice(0, this.renderNum);
  28. },
  29. // 懒加载数据
  30. lazyFun() {
  31. let count = 5;
  32. this.renderList = this.upList.slice(0, this.renderNum + count);
  33. this.renderNum += count;
  34. },
  35. };
  36. </script>

自定义指令拓展

指令钩子函数会被传入以下参数:

  • el:指令所绑定的元素,可以用来直接操作 DOM。
  • binding:一个对象,包含以下 property:
    • name:指令名,不包括 v- 前缀。
    • value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2
    • oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    • expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"
    • arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"
    • modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }
  • vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
  • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

文章参考

vue2.0 自定义指令 ++ element-ui 自定义el-select的下拉懒加载指令 - 灰信网(软件开发博客聚合)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/114837
推荐阅读
相关标签
  

闽ICP备14008679号