0


Element UI - v-infinite-scroll无限滚动组件

一、v-infinite-scroll无限滚动组件使用详解

  1. 1v-infinite-scroll="load" //load无限滚动加载的方法
  2. 2infinite-scroll-disabled //是否禁用无限滚动加载
  3. 3infinite-scroll-delay //节流时延,单位为ms
  4. 4infinite-scroll-distance //触发加载的距离阈值,单位为px
  5. 5infinite-scroll-immediate //是否立即执行加载方法,以防初始状态下内容无法撑满容器。
  6. //默认情况下,infinite-scroll-disabled是false,因此如果组件使用无限滚动加载组件,即使在vue不进行加载方法的调用,组件也会调用该方法,因此如果需要控制的话,尽量是使用infinite-scroll-disabled属性来进行加载方法是否调用的控制。

二、组件无限加载原因及解决方式

1、问题:使用无限加载的div没有设置高度导致无限加载
解决方案:

  1. <div v-infinite-scroll="load" :infinite-scroll-disabled="isInfiniteScrollDisabled" style="margin-bottom: 20px;height:640px;overflow-y:auto" //style的设置非常关键,一定要设置height高度 >

在指令使用的div一定要限定高度(height:xxx; overflow-y:auto)load加载方法将在拉取底部时才会被执行。
2、问题:为什么在vue中并没有在任何生命周期中进行load方法的调用,直接就加载了方法?
解决方案:使用 :infinite-scroll-disabled="isInfiniteScrollDisabled“属性来进行控制。
3、代码demo演示

  1. <template>
  2. <div class="vue-class-name">
  3. <div
  4. v-infinite-scroll="load"
  5. :infinite-scroll-disabled="isInfiniteScrollDisabled"
  6. style="margin-bottom: 20px;height:640px;overflow-y:auto"
  7. >
  8. <div
  9. v-for="item in dataList"
  10. :key="item.index"
  11. style="display: inline-block;margin:0px 10px 10px 0px"
  12. >
  13. <span>{{item}}</span>
  14. </div>
  15. <el-empty
  16. description="No Data"
  17. v-if="dataList.length == 0"
  18. style="height:650px;overflow-y:auto;text-align:center"
  19. ></el-empty>
  20. <!-- 这个div一定要放在使用指令的div里面-->
  21. <div align="center" v-if="dataList.length > 0">
  22. <div class="drawer-footer">
  23. <span v-if="pullStatus === $enum.STATUS.START">
  24. Pull up to load more
  25. </span>
  26. <span v-if="pullStatus === $enum.STATUS.LOADING">
  27. loading
  28. <i class="el-icon-loading"></i>
  29. </span>
  30. <span v-if="pullStatus === $enum.STATUS.NODATA">
  31. no more data
  32. </span>
  33. </div>
  34. </div>
  35. </div>
  36. </div>
  37. </template>
  38. <script>
  39. export default {
  40. name: 'VueName',
  41. mixins: [],
  42. components: {},
  43. props: {},
  44. data: function() {
  45. return {
  46. pullStatus: this.$enum.STATUS.START,
  47. pageIndex: 1,
  48. pageSize: 20,
  49. dataList: [],
  50. isInfiniteScrollDisabled: false,
  51. };
  52. },
  53. computed: {},
  54. watch: {
  55. //事件监听:当刷新浏览器页面或者切换项目的时候进行方法调用
  56. projectSpaceId: function(value, oldValue) {
  57. this.dataList = [];
  58. this.pageIndex = 1;
  59. this.pullStatus = this.$enum.STATUS.START;
  60. this.getLoadMoreData();
  61. },
  62. },
  63. created() {},
  64. mounted() {
  65. //一进入页面进行方法调用
  66. this.getLoadMoreData();
  67. },
  68. methods: {
  69. getLoadMoreData() {
  70. if (this.pullStatus != this.$enum.STATUS.START) {
  71. return;
  72. }
  73. this.pullStatus = this.$enum.STATUS.LOADING;
  74. this.isInfiniteScrollDisabled = true;
  75. let params = {};//请求参数,可省略
  76. this.getData(params).then(resp => {
  77. if (data.length < this.pageSize ) {
  78. this.pullStatus = this.$enum.STATUS.NODATA;
  79. } else {
  80. this.pageIndex++;
  81. this.pullStatus = this.$enum.STATUS.START;
  82. }
  83. if (resp.data.length > 0) {
  84. this.dataList = this.dataList.concat(resp.data);//数组拼接,得到拼接后的数据
  85. }
  86. this.isInfiniteScrollDisabled = false;
  87. });
  88. },
  89. },
  90. beforeDestroy() {
  91. this.dataList = []; //清空数组
  92. };
  93. </script>
  94. <style scoped></style>

三、总结
当然,这个组件还有很多可以优化的地方,比如:可以将下面这一段代码抽成公共组件,使用该组件的地方,只需要传当前的pullStatus状态即可。

  1. <div class="drawer-footer">
  2. <span v-if="pullStatus === $enum.STATUS.START">
  3. Pull up to load more
  4. </span>
  5. <span v-if="pullStatus === $enum.STATUS.LOADING">
  6. loading
  7. <i class="el-icon-loading"></i>
  8. </span>
  9. <span v-if="pullStatus === $enum.STATUS.NODATA">
  10. no more data
  11. </span>
  12. </div>

同时,也可以封装成一个mixins,这样同一个项目,如果多处需要滚动分页,那么这样代码就会更加简洁和方便,下面我粘贴一下mixins里面的代码:

  1. /**
  2. * 页面无限滚动加载
  3. */
  4. export default {
  5. name: "infiniteScrollMixins",
  6. data() {
  7. return {
  8. pullStatus: this.$enum.STATUS.START,
  9. pageIndex: 1,
  10. pageSize: 20,
  11. }
  12. },
  13. computed: {},
  14. created() {},
  15. methods: {
  16. loadMoreData() {
  17. if (this.pullStatus != this.$enum.STATUS.START) {
  18. return;
  19. }
  20. this.pullStatus = this.$enum.STATUS.LOADING;
  21. if(this.getLoadMoreData) {
  22. //使用该mixins的组件需要定义该方法
  23. this.getLoadMoreData();
  24. }
  25. },
  26. setPullStatus(data = []) {
  27. if (data.length < this.pageSize ) {
  28. this.pullStatus = this.$enum.STATUS.NODATA;
  29. } else {
  30. this.pageIndex++;
  31. this.pullStatus = this.$enum.STATUS.START;
  32. }
  33. }
  34. },
  35. beforeDestroy() {},
  36. };

如何使用封装的mixins?
1、导入: import 名称 from ‘路径’;
2、声明: mixins: [mixins名称],
3、此时mixins中定义的data/methods/computed等,在该组件中都可以直接使用,且多个使用mixins的组件的各个变量是相互独立的,值的修改在组件中不会相互影响。


本文转载自: https://blog.csdn.net/m0_70547044/article/details/128517328
版权归原作者 余道各努力,千里自同风 所有, 如有侵权,请联系我们删除。

“Element UI - v-infinite-scroll无限滚动组件”的评论:

还没有评论