• el-table滚动加载、懒加载(自定义指令)


    我们在实际工作中会遇到这样的问题:

    应客户要求,某一个列表不允许分页。但是不分页的话,如果遇到大量的数据加载,不但后端响应速度变慢,前端的渲染效率也会降低,页面出现明显的卡顿。

    那如何解决这个问题呢 

     我们可以用模拟分页,当滚动条滚动到底部时再次加载剩余的部分数据,触底加载,直到加载完成。

    先看一个线上的演示示例:

    https://code.juejin.cn/pen/7273420104565456953

    开发思想参考:

    https://blog.csdn.net/weixin_43340372/article/details/132601018?spm=1001.2014.3001.5501

    代码

    1. <div id="app">
    2. <el-table
    3. :data="tableData"
    4. height="300"
    5. row-key="id"
    6. border
    7. size="mini"
    8. v-el-table-lazyloading="lazyloading"
    9. >
    10. <el-table-column prop="date" label="日期" width="180"> el-table-column>
    11. <el-table-column prop="name" label="姓名" width="180"> el-table-column>
    12. <el-table-column prop="address" label="地址"> el-table-column>
    13. el-table>
    14. div>
    15. <script>
    16. // 伪造接口调用
    17. class Api {
    18. #baseData = [{
    19. date: '2016-05-03',
    20. name: '王小虎',
    21. address: '上海市普陀区金沙江路 1518 弄'
    22. }, {
    23. date: '2016-05-02',
    24. name: '王小虎',
    25. address: '上海市普陀区金沙江路 1518 弄'
    26. }, {
    27. date: '2016-05-04',
    28. name: '王小虎',
    29. address: '上海市普陀区金沙江路 1518 弄'
    30. }, {
    31. date: '2016-05-01',
    32. name: '王小虎',
    33. address: '上海市普陀区金沙江路 1518 弄'
    34. }, {
    35. date: '2016-05-08',
    36. name: '王小虎',
    37. address: '上海市普陀区金沙江路 1518 弄'
    38. }, {
    39. date: '2016-05-06',
    40. name: '王小虎',
    41. address: '上海市普陀区金沙江路 1518 弄'
    42. }, {
    43. date: '2016-05-07',
    44. name: '王小虎',
    45. address: '上海市普陀区金沙江路 1518 弄'
    46. }, {
    47. date: '2016-05-07',
    48. name: '王小虎',
    49. address: '上海市普陀区金沙江路 1518 弄'
    50. }, {
    51. date: '2016-05-07',
    52. name: '王小虎',
    53. address: '上海市普陀区金沙江路 1518 弄'
    54. }, {
    55. date: '2016-05-07',
    56. name: '王小虎',
    57. address: '上海市普陀区金沙江路 1518 弄'
    58. }]
    59. getData(currentPage = 1, pageNumber = 10) {
    60. return new Promise(resolve => {
    61. setTimeout(() => {
    62. let data = [];
    63. if (currentPage > 1) {
    64. data = this.#baseData.map(item => ({...item, name: item.name + `currentPage-${currentPage}`, address: item.address + `currentPage-${currentPage}` }))
    65. } else {
    66. data = this.#baseData;
    67. }
    68. resolve(data);
    69. }, 1000
    70. )
    71. })
    72. }
    73. }
    74. const api = new Api();
    75. // 全局注册组件
    76. new Vue({
    77. el: '#app',
    78. directives: {
    79. "el-table-lazyloading": {
    80. bind(el, binding) {
    81. let SELECT_DOM = el.querySelector(".el-table__body-wrapper");
    82. console.log("SELECT_DOM",SELECT_DOM)
    83. SELECT_DOM.addEventListener("scroll", function () {
    84. let condition =
    85. this.scrollHeight - this.scrollTop <= this.clientHeight;
    86. if (condition) {
    87. binding.value();
    88. }
    89. });
    90. },
    91. },
    92. },
    93. data() {
    94. return {
    95. currentPage: 1,
    96. pageNumber: 10,
    97. value: "",
    98. tableData: [],
    99. };
    100. },
    101. methods: {
    102. async lazyloading() {
    103. this.loading = true;
    104. const data = await api.getData(this.currentPage);
    105. this.loading = false;
    106. this.tableData.push(...data);
    107. this.currentPage++;
    108. }
    109. },
    110. mounted() {
    111. this.lazyloading();
    112. }
    113. })
    114. script>

  • 相关阅读:
    js 事件参考
    Elasticsearch实现词云效果Demo
    ArcGIS实验教程——实验四十七:数据驱动页工具批量制作甘肃省各地级市人口七普专题图集
    jQuery学习:事件委托--新添加的元素没有监听
    机器视觉(三):摄像机标定技术
    CSDN文章复制没有图片只有文字
    十个你要知道的测试小知识
    【Axure视频教程】item和targetitem函数
    零编程制作疫情全国行政区地图,理性看待各地疫情防控减码
    过程构成 中的小棱形 0..* 1..是什么意思过程构成 中的小棱形 0.. 1..*是什么意思
  • 原文地址:https://blog.csdn.net/weixin_43340372/article/details/132617655