list-pull-loading基于vue实现上拉加载、下拉刷新的组件

前言

list-pull-loading是一个基于VUE实现的下拉刷新,上拉加载的组件,支持图片懒加载,数据缓存(返回列表页记住当前位置)。主使用IScroll(iscroll-probe)来实现,提供了项目中数据列表经常会用到的下拉提示信息、上拉提示信息、图片懒加载、回到顶部,其提示信息UI、内容可灵活配置,可使用提供的默认样式也可以自定义也可以隐藏。

列表初始化时也做了优化,对于没有列表数据时显示没有数据的提示信息(可自定义),对于首次加载的数据没有超过一屏时会自动加载下一页的数据,但最多只会自动加载2次(可配置)。

示例

demo使用了vue2+vuex3+vue-router3,对于图片懒加载使用的是vue-lazyload第三方插件。

示例一

image

说明:普通示例

示例二

image

说明:多个tap分类数据列表

示例三

image

说明:数据列表中有图片而且图片还使用了懒加载的方式。

示例四

image

说明:数据列表中的链接跳转到其它页面,再返回时自动加载到上一次看到的状态位置。

运行项目

clone项目到本地,进入项目文件夹,安装依赖

git clone https://github.com/yujinjin/list-pull-loading.git
cd list-pull-loading
npm install

运行demo,会自动打开浏览器地址运行

npm run demo

编译打包项目

npm run compile

NPM

npm install list-pull-loading

依赖

  • VUE
  • IScroll(iscroll-probe)

CDN

https://apps.bdimg.com/libs/list-pull-loading/1.0.0/list-pull-loading.js

https://apps.bdimg.com/libs/list-pull-loading/1.0.0/list-pull-loading.css

<script src="https://apps.bdimg.com/libs/list-pull-loading/1.0.0/list-pull-loading.js"></script>
<link href="https://apps.bdimg.com/libs/list-pull-loading/1.0.0/list-pull-loading.css" rel="stylesheet">
<script>
  Vue.use(ListPullLoading)
  ...
</script>

使用

作为插件

import Vue from 'vue'
import ListPullLoading from 'list-pull-loading'
import 'list-pull-loading/dist/list-pull-loading.css'

// VUE use
Vue.use(ListPullLoading);
// or with options
Vue.use(ListPullLoading, {
    isLoading: false, // API是否正在加载
    hasData: true, // 当前列表是否有数据
    downElHeight: 0, // 下拉元素的高度
    upElHeight: 0, // 上拉提示元素的高度
    scrollerMinHeight: 0, //当前容器最小高度
    directionY: 0, // -1:up 上, 1: down下
    startPullTime: 0, // 开始下拉的时间
    endPullTime: 0, // 结束下拉的时间
    lastQueryTime: 0, // 最后一次查询的时间
    isCanToTop: false, // 根据当前滚动位置判断是否能调到顶部
    isShowToTop: true, // 是否显示去顶部图标
    initMaxTimes: 3, // 初始化数据不够一屏最大查询次数
    noDataText: "没有找到相关的内容哦~", // 没有列表数据时的内容展示
    myScroll: null, // 当前iScroll实例
    api: null, // 当前数据列表API查询接口
    auto: true, // 是否自动查询
    // 图片自适应,默认为false。最好不要设置为true,因为比较消耗资源。
    // 原因是:true的情况下是应用于列表数据里有懒加载的图片但没有指定图片大小导致iScroll计算高度不准确需要的等图片加载完之后再重新计算高度。
    // 目前都是通过监控图片的onload事件来刷新的这样真的不爽但也没找到其他好的解决方案,所以最好是列表中有图片加载时就预先把高度写死
    imgResize: false, 
    iScrollOptions: {
        probeType: 3, //必须指定为3,否则拖动太快就监控不到
        mouseWheel: false,
        disableMouse: true,
        scrollbars: false,
        preventDefault: true
        startY: 0
    }, //IScroll选项
    down: {
        offset: 50, //列表下拉滚动大于50px,即可触发下拉刷新的回调
        initText: "下拉刷新", //初始化文案,这个是在当前下来滚动未超过指定的值时显示文案
        notReleaseText: "松开刷新", // 释放滚动加载时当前下拉高度还未回弹时的文案
        loadingText: "正在加载更多", // 正在加载时的文案
        state: 0, //当前加载时的状态。0:初始化状态 1:未释放滚动加载时 2:正在加载时
        isShowLastTimeText: true // 是否显示最后更新时间提示 
    }, // 下拉刷新
    up: {
        offset: 50, //列表上拉滚动大于50px,即可触发上拉加载的回调
        initText: "上拉加载更多", //初始化文案,当前上拉高度未超过指定的高度时
        notReleaseText: "松开加载更多", // 未释放滚动加载时的文案,当前上拉高度超过指定的高度时且还未释放滚动
        loadingText: "正在加载更多", // 正在加载时的文案
        noMoreText: "没有更多数据了...", // 没有数据时的文案
        state: 0, //当前加载时的状态。0:初始化状态 1:未释放滚动加载时 2:正在加载时 3: 没有更多数据了
    }, // 上拉加载
    parameters: {
        maxResultCount: 20, //每次分页数据加载多少条
        skipCount: 0 //每次数据偏移
    } // 数据查询参数
});

作为组件

import Vue from 'vue'
import {listPullLoading} from 'list-pull-loading'
import "list-pull-loading/dist/list-pull-loading.css"

new Vue({
    // ...
    components: {
        "list-pull-loading": listPullLoading
    }
})

view层举例

<list-pull-loading :options="options" ref="listPullLoading">
    <template slot="list">
        <ul>
            <li v-for="(dataItem,dataIndex) in dataList" :key="dataItem.id">
                <a>
                    ...
                </a>
            </li>
        </ul>
    </template>
</list-pull-loading>

注意

  1. 由于组件使用了IScrol(iscroll-probe)来实现如果项目中是通过webpack来引入IScrol包一定要在webpack.config里配置IScrol的alias,具体如下:
...
    resolve: {
        alias: {
            iscroll: 'iscroll/build/iscroll-probe'
        }
    }
...
  1. 部分老androd机可能会有卡顿现象,建议加入以下css属性样式来提升硬件加速
* {
    -webkit-overflow-scrolling: touch;
}
  1. 发现在chrome浏览器中模拟webapp运行时鼠标滑动很不流畅,原因是新谷歌浏览滚动条的阻止默认事件会失效,所以得所有滚动区域都要加上touch-action:none 来解决。
{
    ...
    touch-action: none;
    ...
}
  1. 由于list-pull-loading组件的滚动不是body上滚动而是在内部盒子里滚动,所以在定义内部的盒子高度,特别是页面内局部滚动。
image

配置选项

名称 描述 默认值 可选项
isShowToTop 是否显示去顶部图标,默认显示 true Boolean
initMaxTimes 初始化列表数据时,如果当前有足够的列表数据但查询的数据不足以覆盖到当前容器的底部会自动进行下一页数据加载,最多自动加载3次(包含初次)。

比如:数据初始化时每次只查询出5条数据,但实际当前的容器盒子需要13条数据才会覆盖到底部,这个时候组件会自动判断如果没有覆盖到底部会自动加载下一页。
3 Number
noDataText 没有列表数据时的文案展示 没有找到相关的内容哦~ String
api 当前数据列表API函数,函数的返回值必须是Promise类型,必须配置。 null Function
auto 是否自动查询,默认初始化会自动加载API数据 true Boolean
imgResize 是否自动查询图片自适应,默认为false。最好不要设置为true,因为比较消耗资源。

原因是:true的情况下是应用于列表数据里有懒加载的图片但没有指定图片大小导致iScroll计算高度不准确需要的等图片加载完之后再重新计算高度。

当前都是通过监控图片的onload事件来刷新的,这样真的不爽但也没找到其他好的解决方案,所以最好是列表中有图片加载时就预先把高度预算好
true Boolean
iScrollOptions iscroll的配置选项。

其中probeType的配置选项为3,否则拖动太快就监控不到。
{probeType: 3, mouseWheel: false, disableMouse: true, scrollbars: false, preventDefault: true, startY: 0} 具体可自行查询iscroll的API
down 下拉刷新配置选项。

offset:列表下拉滚动的偏移px数量(number类型),即可触发下拉刷新的回调

initText:初始化文案,这个是在当前下来滚动未超过指定的值时显示文案

notReleaseText:释放滚动加载时当前下拉高度还未回弹时的文案

loadingText:数据正在加载时的文案

state:当前加载时的状态(number类型)。0:初始化状态 1:未释放滚动加载时 2:正在加载时

isShowLastTimeText:是否显示最后更新时间提示
down: {offset: 50, initText: "下拉刷新", notReleaseText: "松开刷新", loadingText: "正在加载更多", state: 0, isShowLastTimeText: true} Object
up 上拉加载配置选项。

offset:列表上拉加载滚动的偏移px数量(number类型),即可触发加载数据的回调

initText:初始化文案,当上拉高度未超过指定的高度时

notReleaseText:未释放滚动加载时的文案,当前上拉高度超过指定的高度时且还未释放滚动时。

loadingText: 上拉API正在加载时的文案

noMoreText:没有数据时的文案

state:0:初始化状态 1:未释放滚动加载时 2:正在加载时 3: 没有更多数据了
up: {offset: 50, initText: "上拉加载更多", notReleaseText: "松开加载更多", loadingText: "正在加载更多", noMoreText: "没有更多数据了...", state: 0} Object
parameters API数据参数,默认只有maxResultCount:每次分页数据加载多少条,skipCount:每次查询数据的开始索引2个参数 {maxResultCount: 20, skipCount: 0} Object

API

1. refresh

刷新数据列表,有时根据实际的业务需要,需手动刷新列表数据。

this.$refs['listPullLoading'].refresh();//listPullLoading是组件注册引用名称
2. initIScrollCacheData

初始化列表的缓存数据,主要用于列表数据的缓存

this.$refs['listPullLoading'].initIScrollCacheData(y=0, upState=0);//y 当前滚动条的y轴位置,upState 当前下拉列表的状态
3. destroy

组件销毁

this.$refs['listPullLoading'].destroy();//listPullLoading是组件注册引用名称

最后

  • 如果喜欢一定要 star哈!!!(谢谢!!)

  • 如果有意见和问题 请在 lssues提出,我会在线解答。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容