• el-table 表格从下往上滚动,触底自动请求新数据


    关键点:

    1、 el-table 需要设置高度 height;

    2、el-table 外层盒子需要设置一个高度,并且设置 overflow:hidden;

    3、获取 el-table 的 bodyWrapper:divData

          divData.scrollTop + divData.clientHeight + 1 >= divData.scrollHeight;(触底)

          重新请求数据;并将列表置顶:设置 divData.scrollTop = 0;

    4、为el-table 添加鼠标移入移除事件,启停滚动;

    1. <template>
    2. <div class="span-roll-table">
    3. <div class="table-contain">
    4. <el-table
    5. ref="rollTable"
    6. :data="list"
    7. height="100%"
    8. :span-method="objectSpanMethod"
    9. :header-cell-style="{
    10. textAlign: 'center',
    11. width: 'fit-content',
    12. backgroundColor: '#F2F6FC',
    13. }"
    14. class="table"
    15. @mouseenter.native="stopScroll"
    16. @mouseleave.native="startScroll"
    17. >
    18. el-table>
    19. div>
    20. div>
    21. template>
    22. <script>
    23. export default {
    24. data() {
    25. return {
    26. list: [],
    27. rollTimer: null,
    28. };
    29. },
    30. mounted() {
    31. this.startScroll();
    32. },
    33. methods: {
    34. // 获取新数据
    35. async onChange() {
    36. this.list = [
    37. {
    38. name: "1",
    39. },
    40. {
    41. name: "2",
    42. },
    43. {
    44. name: "3",
    45. },
    46. {
    47. name: "4",
    48. },
    49. ];
    50. // 将列表置顶
    51. this.$nextTick(() => {
    52. const table = this.$refs.rollTable;
    53. const divData = table.bodyWrapper;
    54. divData.scrollTop = 0;
    55. });
    56. },
    57. // 开始滚动
    58. startScroll() {
    59. this.tableScroll(false);
    60. },
    61. // 停止滚动
    62. stopScroll() {
    63. this.tableScroll(true);
    64. },
    65. // 列表滚动
    66. tableScroll(stop) {
    67. if (stop) {
    68. if (this.rollTimer) {
    69. clearInterval(this.rollTimer);
    70. return;
    71. }
    72. }
    73. const table = this.$refs.rollTable;
    74. const divData = table.bodyWrapper;
    75. this.rollTimer = setInterval(() => {
    76. divData.scrollTop += 2;
    77. this.$nextTick(() => {
    78. if (
    79. divData.scrollTop + divData.clientHeight + 1 >=
    80. divData.scrollHeight
    81. ) {
    82. this.onChange();
    83. }
    84. });
    85. }, 200);
    86. },
    87. // 合并列表第一个单元格(并列排名)
    88. objectSpanMethod({ row, column, rowIndex, columnIndex }) {
    89. if (columnIndex === 0) {
    90. // 获取当前单元格的值(单元格项一定要配置 prop 属性,否则拿不到值!!!!)
    91. const currentValue = row[column.property];
    92. // 获取上一行相同列的值
    93. const preRow = this.typeTableData[rowIndex - 1];
    94. const preValue = preRow ? preRow[column.property] : null;
    95. // 如果当前值和上一行的值相同,则将当前单元格隐藏
    96. if (currentValue === preValue) {
    97. return { rowspan: 0, colspan: 0 };
    98. } else {
    99. // 否则计算当前单元格应该跨越多少行
    100. let rowspan = 1;
    101. for (let i = rowIndex + 1; i < this.typeTableData.length; i++) {
    102. const nextRow = this.typeTableData[i];
    103. const nextValue = nextRow[column.property];
    104. if (nextValue === currentValue) {
    105. rowspan++;
    106. } else {
    107. break;
    108. }
    109. }
    110. return { rowspan, colspan: 1 };
    111. }
    112. }
    113. },
    114. },
    115. beforeDestroy() {
    116. clearInterval(this.rollTimer);
    117. this.startScroll = () => {};
    118. },
    119. };
    120. script>
    121. <style lang="less" scoped>
    122. .span-roll-table {
    123. height: 400px;
    124. .table-contain {
    125. height: 100%;
    126. overflow: hidden;
    127. }
    128. }
    129. /* 隐藏滚动条,但仍然可以滚动 */
    130. ::v-deep .el-table__body-wrapper::-webkit-scrollbar {
    131. display: none; /* 针对Webkit浏览器 */
    132. }
    133. style>

    参考文章

  • 相关阅读:
    C# 编写小巧快速的 Windows 动态桌面软件
    【javase基础】第十七篇:异常(Exception)
    Allegro如何快速将目标旋转90度操作指导
    javaScript中Number数字类型方法入门
    架构师的 36 项修炼第09讲:系统的安全架构设计
    不用 Spring 居然连最基本的接口都不会写了
    毫无基础的人如何入门 Python ?
    线程本地存储 ThreadLocal
    PyTorch深度学习笔记之五(使用神经网络拟合数据)
    P1164 小A点菜
  • 原文地址:https://blog.csdn.net/m0_48571414/article/details/137973120