比loadmore更好用的scroller

npm i vue-scroller -s
import VueScroller from 'vue-scroller';
Vue.use(VueScroller);

用法:

<template>
    <div class="app1">
        <div v-bind:class="[loading ? 'main mainIn' : 'main']">
            <div class="reload">
                <scroller ref="scroller"
                          :on-refresh="refresh"
                          :on-infinite="infinite"
                          :noDataText="loadCompleted"
                          :refreshText="pull">
                    <div v-for="item in dataList">
                        <v-video v-if="item.modelCode === 'video'" :data="item"></v-video>
                        <one-photo v-if="item.modelCode === 'imageAndText'" :data="item"></one-photo>
                        <more-photo v-if="item.modelCode === 'moreImageText'" :data="item"></more-photo>
                        <v-text v-if="item.modelCode === 'text'" :data="item"></v-text>
                        <Photos v-if="item.modelCode === 'moreImage'" :data="item"></Photos>
                        <Special v-if="navigationType === 'special'" :data="item"></Special>
                    </div>
                </scroller>
            </div>
        </div>
    </div>
</template>
<script>
    import onePhoto from '../common/OnePhoto';
    import morePhoto from '../common/MorePhoto';
    import vText from '../common/Text';
    import vVideo from '../common/Video';
    import Photos from '../common/Photos';
    import Special from '../common/Special';
    export default {
        data() {
            return {
                loading: 0,
                page: 0,
                rows: 10,
                dataList: [],
                itemInfo: Number(this.$route.params.id),
                navigationType: this.$route.params.type,

                pull: this.$lang.pull,
                loadCompleted: this.$lang.loadCompleted,
                type: 1,
            }
        },
        components:{
            onePhoto, morePhoto, vText, vVideo, Photos, Special
        },
        mounted() {
        },
        methods: {
            refresh(done) {
                this.type = 1;
                this.getNewsList(done);
            },
            infinite(done) {
                this.type = 2;
                this.getNewsList(done);
            },
            getNewsList(done) {
                this.type === 1 ? this.page = 1 : this.page += 1;
                let apiFunction = '';
                let dataObj = {
                    categoryId: this.itemInfo,
                    page: this.page,
                    pagesize: this.rows,
                };
                if (this.navigationType === 'special') {
                    apiFunction = 'special/querySpecialList';
                } else if (this.navigationType === 'video') {
                    dataObj = {
                        modelCode: 'video',
                        categoryId: -1,
                        page: this.page,
                        pagesize: this.rows,
                    };
                    apiFunction = 'news/getNewsPage';
                } else {
                    apiFunction = this.itemInfo === -1 ? 'news/getIndexNewsPage' : 'news/getNewsByCategoryId';
                }
                this.$http(`${this.$host}/${apiFunction}`, 'get', dataObj)
                    .then((data) => {
                        if (data.resCode === 0) {
                            this.loading = 1;
                            let dataList = data.data.dataList;
                            if (!dataList.length) {
                                this.$refs.scroller.finishInfinite(2);
                                return;
                            }
                            for (let i = 0; i < dataList.length; i++) {
                            }
                            if (this.type === 1) {
                                this.dataList = dataList;
                            } else {
                                this.dataList = [...this.dataList, ...dataList];
                            }
                            setTimeout(function () {
                                done();
                            },1000)
                        } else {
                            this.$toast(data.resMsg);
                        }
                    });
            }
        }
    }
</script>

<style scoped>
    .reload {
        height: 100%;
        font-size: 0.1rem;
        color: #999999;
    }
</style>

 

 

滚动条组件属性:

属性名称描述需求默认值
onRefresh下拉刷新回调N-
onInfinite无限加载回调N-
refreshText自定义下拉刷新文字N下拉刷新
noDataText自定义没有更多数据文字N没有更多数据
width滚动容器宽度N100%
height滚动容器高度N100%
snapping加载图标Nfalse
snappingWidth宽度N100 (stand for 100px)
snappingHeight高度N100
refreshLayerColor下拉刷新文字颜色N#AAA
loadingLayerColor无限加载文字颜色N#AAA
minContentHeight滚动条的最小内容高度 (px) N0

实例方法:

  • resize() (deprecated, cause the scroller's content resizes self automatically)
  • triggerPullToRefresh()
  • finishPullToRefresh() 终止下拉刷新
  • finishInfinite(isNoMoreData :Boolean) 停止无限加载
  • scrollTo(x:Integer, y:Integer, animate:Boolean) 
  • scrollBy(x:Integer, y:Integer, animate:Boolean) 滚动滚动内容中的位置
  • getPosition :Object 获取滚动内容的当前位置

vue-scroller https://www.npmjs.com/package/vue-scroller(翻译不好,请参考原文api)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值