• uni-app上拉加载更多分页数据(核心:滚动条触到底部时page+1; 使用concat()或者push()都能实现)


    1、文档加载完成时显示第一页的数据,当滚动条下拉触到底部时加载下一页且数据追加到上一页中。

    (这个例子包含了tab切换,使用push() 方法实现)

    <template>
        <view class="container prohibition">
            <view class="demo" :style="'height:' +  demo.height + 'px;' + 'padding-top:' + demo.top + 'px;padding-bottom:10rpx'">
                <view class="left" :style="'top:' + demo.top + 'px'">
                    <view class="iconfont icon-zuo" @tap='backleft'></view>
                </view>
                <view class="clr_fff">我的订单</view>
            </view>
    
            <view class="pd_t123">
    
                <!-- 顶部导航栏 -->
                <view class="horizonal-tab">
                    <scroll-view scroll-x="true" scroll-with-animation class="scroll-tab">
                        <block v-for="(item,index) in tabBars" :key="index">
                            <view class="scroll-tab-item" :class="{'active': tabIndex==index}" @tap="toggleTab(index)">
                                {{item.name}}
                                <view class="scroll-tab-line"></view>
                            </view>
                        </block>
                    </scroll-view>
                </view>
    
                <!-- 内容区 -->
                <view class="">
                    <!-- 滑块视图 -->
                    <view class="content">
                        <view class="items">
                                <view class="item" v-for="(items,index1) in queryList" :key="index1">                            
                                <view class="orderid">
                                    <text class="title">订单号:{{items.order_no}}</text>
                                    <view>
                                        <image class="sucessImg" src="https://test134.vrapp.chot.cn/mini/picture/135_57.png" mode="widthFix"></image>
                                    </view>
                                </view>
    
                                <view class="infor uni-flex">
                                    <view>
                                        <image class="orderPrdImg" mode="widthFix" @error="errImg" :src="items.goods_logo"></image>
                                    </view>
                                    <view class="infordt">
                                        <view class="title">{{items.goods_title}}</view>
                                        <view class="price">¥{{ items.price_real }}元/天</view>
                                        <view class="num">x{{ items.number_goods }}</view>
                                    </view>
                                </view>
                                <view class="pay">
                                    实付款:¥{{items.price_real * items.number_goods}}
                                </view>
                                <view class="btn">
                                    <button @tap="order_detail(index1)">查看订单</button>
                                    <button>再次购买</button>
                                    <button v-show="hidden == false">立即评价</button>
                                </view>
                            </view>
                        </view>
                        <uni-load-more :status="status" :content-text="contentText" />
                    </view>
                </view>
    
    
            </view>
    
        </view>
    </template>
    
    <script>
        import uniLoadMore from '../../components/uni-load-more/uni-load-more.vue';
        export default {
            components: {
                uniLoadMore
            },
            data() {
                return {
                    tabIndex: 0,
                    /* 选中标签栏的序列,默认显示第一个 */
                    page: 1,
                    pageSize: 3,
                    hidden: false,
                    status: 'more',
                    contentText: {
                        contentdown: '上拉加载更多',
                        contentrefresh: '加载中.....',
                        contentnomore: '没有更多数据啦'
                    },
                    tabBars: [{
                            name: '全部',
                            id: 'guanzhu'
                        },
                        {
                            name: '待付款',
                            id: 'tuijian'
                        },
                        {
                            name: '预约成功',
                            id: 'redian'
                        },
                        {
                            name: '已完成',
                            id: 'tiyu'
                        }
    
                    ],
                    demo: {
                        top: 0,
                        height: 0
                    },
                    data: {},
                    queryList: [],
                    newArrayData: []
                }
            },
            onLoad() {
                var status = ''
                this.getOrderList(status);// 默认显示第一页的数据即可
            },
            created() {
                const demo = uni.getMenuButtonBoundingClientRect()
                this.demo.top = demo.top
                this.demo.height = demo.height
            },
            onReachBottom(e) {
                this.page++; //滚动条触到底部时page+1
                if(this.tabIndex==0){
                    var status = ''; 
                    this.getOrderListMore(status); //加载的数据
                }else if(this.tabIndex==1){
                    var status = 2; 
                    this.getOrderListMore(status); //加载的数据
                }else if(this.tabIndex==2){
                    var status = 1; 
                    this.getOrderListMore(status); //加载的数据
                }else if(this.tabIndex==3){
                    var status = 5; 
                    this.getOrderListMore(status); //加载的数据
                }
                
            },
            methods: {
                backleft(e) {
                    uni.navigateBack();
                },
                order_detail(index) {
                    uni.setStorageSync('order_no', this.queryList[index].order_no);
                    uni.navigateTo({
                        url: '../orderDetail/orderDetail'
                    })
                },
                errImg() {
                    this.queryList.forEach((val) => {
                        if (val.goods_logo.length == 29) { // 图片不完整路径
                            val.goods_logo = 'https://test134.vrapp.chot.cn/mini/picture/orderImg.png';
                        }
                        if (val.number_goods == null || val.goods_title == null || val.price_real == null) {
                            val.number_goods = 1;
                            val.price_real = 0;
                            val.goods_title = '居家生活料理套餐'
                        }
                    });
                },
                navsHandleClick(i) {
                    console.log(i);
                    this.current = i;
                },
                intervalChange(e) {
                    this.current = e.detail.current;
                },
                //切换选项卡
                toggleTab(index) {
                    this.tabIndex = index;
                    this.page = 1; // 切换tab时page从1开始
    
                    if (this.tabIndex == 1) {
                        this.hidden = true;
                    } else {
                        this.hidden = false;
                    }
                    switch (this.tabIndex) {
                        case 1:
                            var status = 2 // 待付款
                            this.getOrderList(status);
                            break;
                        case 2:
                            var status = 1 // 预约成功
                            this.getOrderList(status);
                            break;
                        case 3:
                            var status = 5 // 已完成
                            this.getOrderList(status);
                            break;
                        default:
                            var status = '' // 默认显示全部列表
                            this.getOrderList(status);
                            break;
                    }
                },
                //滑动切换swiper
                tabChange(e) {
                    console.log(e);
                    this.tabIndex = e.detail.current;
                },
                //获取订单信息
                async getOrderList(status) {
                    const mid = uni.getStorageSync('mid');
                    let data = {
                        operate: 'Order.index',
                        mid: 1,
                        page: this.page,
                        status: status
                    }
                    const res = await this.$myRequset({
                        url: '/api',
                        method: "POST",
                        data: data
                    })
                    this.queryList = res.data.data.list.list;
                    let pages = Math.ceil(res.data.data.list.count / this.pageSize);
                    if (this.page == pages) {
                        this.status = "nomore";
                    }
                },
                async getOrderListMore(status) {
                    const mid = uni.getStorageSync('mid');
                    let data = {
                        operate: 'Order.index',
                        mid: 1,
                        page: this.page,
                        status: status
                    }
                    const res = await this.$myRequset({
                        url: '/api',
                        method: "POST",
                        data: data
                    })
                    for(var i=0;i<res.data.data.list.list.length;i++){                    
                        this.queryList.push(res.data.data.list.list[i]); // 加载的数据追加在上一页后面
                    }
                    let pages = Math.ceil(res.data.data.list.count / this.pageSize);
                    if (this.page == pages) {
                        this.status = "nomore";
                    }
                }
            }
        }
    </script>


    下面的Demo相对较为简单,代码较为简单,接口是加载一次调用一次,但是直接调用方法不用写两遍。
    <template>
        <view>
            <view class="demo" :style="'height:' +  demo.height + 'px;' + 'padding-top:' + demo.top + 'px;padding-bottom:10rpx'">
                <view class="left" :style="'top:' + demo.top + 'px'">
                    <view class="iconfont icon-zuo" @tap='backleft'></view>
                </view>
                <view class="top_title">健康百科</view>
            </view>
            <view class="pd-t135">
                <view class="head_cont">
                    <image :src="fullImg"></image>
                    <text class="head_title">{{full_title}}</text>
                </view>
            </view>
            <view class="list">
                <view class="uni-padding-wrap backWhite wauto80" v-for="(item,index) in infoList" :key="index">
                    <view class="uni-flex info_item">
                        <view class="info">
                            <view class="title">
                                <span class="tag">{{item.label}}</span>
                                <text>{{ item.title }}</text>
                            </view>
                            <view class="des">
                                <text class="newsdata">{{ item.create_time }}</text>
                                <image class="w23" src="../../static/images/news_eye.png"></image> <text class="newsdata">{{ item.number }}</text>
                            </view>
                        </view>
                        <view class="imgRignt">
                            <image class="newsImg" :src="item.thumb"></image>
                        </view>
                    </view>
                </view>
                <uni-load-more :status="status" :content-text="contentText" />
            </view>
        </view>
    </template>
    
    <script>
        import uniLoadMore from '../../components/uni-load-more/uni-load-more.vue';
        export default {
            name: "news",
            components: {
                uniLoadMore
            },
            data() {
                return {
                    demo: {
                        top: 0,
                        height: 0
                    },
                    infoList: [],
                    fullImg: '',
                    full_title: '',
                    contentText: {
                        contentdown: '上拉加载更多',
                        contentrefresh: '加载中.....',
                        contentnomore: '没有更多数据啦'
                    },
                    page: 1,
                    status: 'more',
                    pageSize: 1,
                }
            },
            onLoad() {
                this.getList();
            },
            created() {
                const demo = uni.getMenuButtonBoundingClientRect()
                this.demo.top = demo.top
                this.demo.height = demo.height
                uni.setNavigationBarColor({
                    frontColor: '#000000',
                    backgroundColor: '#000000'
                })
            },
            onReachBottom() {
                this.page++;
                if (this.status != 'more') {
                    return false;
                }
                this.status = 'more'; //设置sataus是更多
                this.getList(); //加载的数据
            },
            methods: {
                backleft(e) {
                    uni.navigateBack();
                },
                async getList() {
                    const res = await this.$myRequset({
                        url: '/api',
                        data: {
                            operate: 'News.index',
                            page: this.page
                        }
                    });
                    let banner = res.data.data.list.one;
                    this.full_title = banner.title;
                    this.fullImg = banner.thumb;
                    let resList = res.data.data.list.list;
                    let list = this.setTime(resList);
                    this.infoList = this.infoList.concat(list);
                    for (let i = 0; i < this.infoList.length; i++) {
                        if (this.infoList[i].label === '') {
                            this.infoList[i].label = '生活'
                        } else {
                            this.infoList[i].label = this.infoList[i].label.substr(0, 2);
                        }
                    }
                    let pages = Math.ceil(res.data.data.list.count / this.pageSize);
                    if (this.page == pages) {
                        this.status = "nomore";
                    }
                },
                setTime: function(items) {
                    var newItems = [];
                    items.forEach(e => {
                        newItems.push({
                            title: e.title,
                            label: e.label,
                            thumb: e.thumb,
                            create_time: e.create_time,
                            number: e.number
                        });
                    });
                    return newItems;
                },
            }
        }
    </script>
    
  • 相关阅读:
    Arch Linux 安装 ibus-rime
    macOS安装Python MySQLdb
    CentOS 7 安装 gcc 4.1.2
    Windows 10安装Python 2.7和MySQL-python
    小米Air安装Arch Linux之图形界面配置(Gnome 和 sway)持续更新中……
    小米Air 13.3 安装Arch Linux
    Linux Shell脚本攻略总结(1)
    Ubuntu下删除配置错误或者失败的安装包
    oProfile的安装与使用
    动态链接库VS静态链接库
  • 原文地址:https://www.cnblogs.com/LindaBlog/p/13264947.html
Copyright © 2020-2023  润新知