草庐IT

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

Country Programmer 2023-04-22 原文

一、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无限滚动组件的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - ruby数组奇怪的东西(无限数组) - 2

    当我写下面的代码时:x=[1,2,3]x我得到这个输出:[1,2,3,[...]][1,2,3,[...]][1,2,3,[...]]我不应该只得到[1,2,3,[1,2,3]]吗?解释是什么? 最佳答案 这没什么奇怪的。数组的第四个元素就是数组本身,所以当你求第四个元素时,你得到的是数组,当你求第四个元素的第四个元素时,你得到的是数组,当你求第四个元素时,你得到的是数组。第四个元素的第四个元素的第四个元素的元素......你得到了数组。就这么简单。唯一有点不寻常的是Array#to_s检测到这样的递归,而不是进入无限循环,而是返回

  3. ruby - 绕过 Element 的方法无法滚动到 View 中 - Watir-webdriver with Ruby - 2

    因此,我们的页面中有以下代码:OnOff这是2个单选按钮。'开和关'。“关闭”是默认值。使用Watir-webdriver和Ruby,我们想要选择“打开”单选按钮。我们这样做:browser.radio(:id=>"HasRegistration_true").set但在这样做时,我们得到以下错误:`WebElement.clickElement':Elementcannotbescrolledintoview:[objectHTMLInputElement](Selenium::WebDriver::Error::MoveTargetOutOfBoundsError)我们知道Sele

  4. sql - Arel 导致聚合无限循环 - 2

    我在使用Arel聚契约(Contract)一查询中的2列时遇到了问题。当我运行它时,在railsdev-server崩溃之前,整个服务器会卡住一分钟。我怀疑是无限循环:)。也许我误解了Arel的整个概念,如果有人能看一下,我将不胜感激。这个查询的预期结果是这样的:[{:user_id=>1,:sum_account_charges=>300,:sum_paid_debts=>1000},...]a_account_charges=Table(:account_charges)a_paid_debts=Table(:paid_debts)a_participants=Table(:exp

  5. ruby - 如何将用户中断添加到无限循环中? - 2

    我下面有一个ruby​​脚本,它无限地打印从1开始的数字。如何通过终端中的中断(如“Ctrl+C”或键“q”)使脚本停止无限执行?a=0while(a)putsaa+=1#thecodeshouldquitifaninterruptofacharacterisgivenend在每次迭代中,不应询问用户输入。 最佳答案 使用Kernel.trap为Ctrl-C安装信号处理程序:#!/usr/bin/rubyexit_requested=falseKernel.trap("INT"){exit_requested=true}while!

  6. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  7. Ruby 堆栈级别太深异常不是来自递归无限循环 - 2

    编辑:(已解决)实际上它可能是因为无限循环而引发的我正在编码,在添加一个方法后我得到了这个:user_name@the_computer:/media/ECC3-C3B0/Prog/mts/src/mts$raketest--trace**Invoketest(first_time)**Executetest/home/user_name/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:stackleveltoodeep(SystemStackError)rakeabo

  8. ruby - 为什么这个递归不是无限的? - 2

    我和我的friend们正在做一些基本的Ruby练习来感受这门语言,我们遇到了一个我们还无法理解的有趣行为。基本上,我们正在创建一个tree只有一个类的数据类型,node,它只包含一个值和一个包含零个或多个nodes的数组.我们正在使用rspec的autospec测试运行程序。有一次,我们开始编写测试以禁止无限递归(循环树结构)。这是我们的测试:it"breaksonacircularreference,whichwewillfixlater"dotree1=Node.new1tree2=Node.new1tree2.add_childtree1tree1.add_childtree2(

  9. ruby - 迭代 Ruby 中的无限序列 - 2

    我正在尝试解决ProjectEuler问题#12:Thesequenceoftrianglenumbersisgeneratedbyaddingthenaturalnumbers.Sothe7thtrianglenumberwouldbe1+2+3+4+5+6+7=28.Thefirsttentermswouldbe:1,3,6,10,15,21,28,36,45,55,...Letuslistthefactorsofthefirstseventrianglenumbers:1:13:1,36:1,2,3,610:1,2,5,1015:1,3,5,1521:1,3,7,2128:1,2

  10. ruby - 模块化、基于组件的 Sinatra 应用程序的架构 - 2

    我正在开发一个包含大约10个不同功能组件的Sinatra应用程序。我们希望能够将这些组件混合并匹配到应用程序的单独实例中,完全从config.yaml文件配置,如下所示:components:-route:'/chunky'component_type:FoodListercomponent_settings:food_type:baconmax_items:400-route:'places/paris'component_type:Mappercomponent_settings:latitude:48.85387273165654longitude:2.340087890625-

随机推荐