Element UI中v-infinite-scroll无限滚动组件使用详解

 更新时间:2023年02月08日 10:29:34   作者:Country Programmer  
在移动端数据的更新中许多方法孕育而生,无限滚轮也是解决的方案一种,Element-ui为vue开发了一个事件(v-infinite-scroll),下面这篇文章主要给大家介绍了关于Element UI中v-infinite-scroll无限滚动组件使用的相关资料,需要的朋友可以参考下

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

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

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

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

解决方案:
<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演示

<template>
  <div class="vue-class-name">
    <div
      v-infinite-scroll="load"
      :infinite-scroll-disabled="isInfiniteScrollDisabled"
      style="margin-bottom: 20px;height:640px;overflow-y:auto"
    >
      <div
        v-for="item in dataList"
        :key="item.index"
        style="display: inline-block;margin:0px 10px 10px 0px"
      >
        <span>{{item}}</span>
      </div>
      <el-empty
        description="No Data"
        v-if="dataList.length == 0"
        style="height:650px;overflow-y:auto;text-align:center"
      ></el-empty>
      
      <!-- 这个div一定要放在使用指令的div里面-->
      <div align="center" v-if="dataList.length > 0"> 
        <div class="drawer-footer">
          <span v-if="pullStatus === $enum.STATUS.START">
            Pull up to load more
          </span>
          <span v-if="pullStatus === $enum.STATUS.LOADING">
            loading
            <i class="el-icon-loading"></i>
          </span>
          <span v-if="pullStatus === $enum.STATUS.NODATA">
            no more data
          </span>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: 'VueName',
  mixins: [],
  components: {},
  props: {},
  data: function() {
    return {
     pullStatus: this.$enum.STATUS.START,
     pageIndex: 1,
     pageSize: 20,
     dataList: [],
     isInfiniteScrollDisabled: false,
    };
  },
  computed: {},
  watch: {
  //事件监听:当刷新浏览器页面或者切换项目的时候进行方法调用
    projectSpaceId: function(value, oldValue) {
      this.dataList = [];
      this.pageIndex = 1;
      this.pullStatus = this.$enum.STATUS.START;
      this.getLoadMoreData();
    },
  },
  created() {},
  mounted() {
  //一进入页面进行方法调用
    this.getLoadMoreData();
  },
  methods: {
    getLoadMoreData() {
      if (this.pullStatus !=  this.$enum.STATUS.START) {
       return;
       }
      this.pullStatus = this.$enum.STATUS.LOADING;
      this.isInfiniteScrollDisabled = true;
      let params = {};//请求参数,可省略
      this.getData(params).then(resp => {
        if (data.length < this.pageSize ) {
                this.pullStatus = this.$enum.STATUS.NODATA;
            } else {
                this.pageIndex++;
                this.pullStatus = this.$enum.STATUS.START;
            }
        if (resp.data.length > 0) {
          this.dataList = this.dataList.concat(resp.data);//数组拼接,得到拼接后的数据
        }
        this.isInfiniteScrollDisabled = false;
      });
    },
  },
  beforeDestroy() {
    this.dataList = []; //清空数组
};
</script>
<style scoped></style>

//常量定义
export const STATUS= {
  START: 0, // 上拉加载
  LOADING: 1, // 加载中
  NODATA: 2, // 没有更多数据
};

三、总结

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

<div class="drawer-footer">
          <span v-if="pullStatus === $enum.STATUS.START">
            Pull up to load more
          </span>
          <span v-if="pullStatus === $enum.STATUS.LOADING">
            loading
            <i class="el-icon-loading"></i>
          </span>
          <span v-if="pullStatus === $enum.STATUS.NODATA">
            no more data
          </span>
        </div>

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

/** 
 * 页面无限滚动加载
*/
export default  {
    name: "infiniteScrollMixins",
    data() {
        return {
            pullStatus: this.$enum.STATUS.START,
            pageIndex: 1,
            pageSize: 20,
        }
    },
    computed:  {},
    created() {},
    methods: {
        loadMoreData() {
            if (this.pullStatus !=  this.$enum.STATUS.START) {
                return;
            }
            this.pullStatus = this.$enum.STATUS.LOADING;
            if(this.getLoadMoreData) {
            //使用该mixins的组件需要定义该方法
                this.getLoadMoreData();
            }
        },

        setPullStatus(data = []) {
            if (data.length < this.pageSize ) {
                this.pullStatus = this.$enum.STATUS.NODATA;
            } else {
                this.pageIndex++;
                this.pullStatus = this.$enum.STATUS.START;
            }
        }
    },
    beforeDestroy() {},
};

如何使用封装的mixins?

1、导入: import 名称 from ‘路径’;

2、声明: mixins: [mixins名称],

3、此时mixins中定义的data/methods/computed等,在该组件中都可以直接使用,且多个使用mixins的组件的各个变量是相互独立的,值的修改在组件中不会相互影响。(此处不理解可以去学习一下mixins的相关文档)

总结

到此这篇关于Element UI中v-infinite-scroll无限滚动组件使用的文章就介绍到这了,更多相关Element UI v-infinite-scroll无限滚动组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue权限管理系统的实现代码

    vue权限管理系统的实现代码

    这篇文章主要介绍了vue权限管理系统的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • vue2.0 实现导航守卫的具体用法(路由守卫)

    vue2.0 实现导航守卫的具体用法(路由守卫)

    这篇文章主要介绍了vue2.0 实现导航守卫的具体用法(路由守卫),vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • vue axios 给生产环境和发布环境配置不同的接口地址(推荐)

    vue axios 给生产环境和发布环境配置不同的接口地址(推荐)

    这篇文章主要介绍了vue axios 给生产环境和发布环境配置不同的接口地址,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • vue实现自定义组件挂载原型上

    vue实现自定义组件挂载原型上

    这篇文章主要介绍了vue实现自定义组件挂载原型上方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vue远程加载sfc组件思路详解

    vue远程加载sfc组件思路详解

    这篇文章主要介绍了vue远程加载sfc组件思路详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • vue-cli3设置代理无效的解决

    vue-cli3设置代理无效的解决

    这篇文章主要介绍了vue-cli3设置代理无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 关于electron打包的坑

    关于electron打包的坑

    本文主要介绍了关于electron打包的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Vue集成lodop插件实现打印功能

    Vue集成lodop插件实现打印功能

    lodop 取意自“load or print”,是一款优秀的 Web 打印控件。本文将在Vue中集成lodop插件实现打印功能,感兴趣的小伙伴可以了解一下
    2023-01-01
  • 详解Vue3中shallowRef和shallowReactive的使用

    详解Vue3中shallowRef和shallowReactive的使用

    这篇文章主要为大家介绍了Vue3中shallowRef和shallowReactive函数的使用方法,文中的示例代码讲解详细,对我们学习Vue有一定的帮助,需要的可以参考一下
    2022-07-07
  • vue异步组件与组件懒加载问题(import不能导入变量字符串路径)

    vue异步组件与组件懒加载问题(import不能导入变量字符串路径)

    这篇文章主要介绍了vue异步组件与组件懒加载问题(import不能导入变量字符串路径),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04

最新评论