[log] vue使用Mint组件实现下拉刷新、上拉加载

本文详细介绍了如何使用Mint UI的Loadmore组件实现下拉刷新和上拉加载功能,通过具体代码示例展示了如何配置和使用该组件,包括监听状态变化、执行刷新和加载方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://mint-ui.github.io/docs/#/zh-cn2/loadmore
使用的vue

    <mt-loadmore
                :top-method="loadTop"
                :bottom-method="loadBottom"
                :bottom-all-loaded="allLoaded"
                ref="loadmore"
                @top-status-change="handleTopChange"
                @bottom-status-change="handleBottomChange"
                bottomPullText="上拉加载"
                bottomDropText="释放加载"
                bottomLoadingText="加载中...">
            <div class="r2">
                <div class="res" v-for="(i,index) in 6" :key="index">
                   
            </div>
            <div slot="top" class="mint-loadmore-top">
                <span v-show="topStatus !== 'loading'" :class="{ 'rotate': topStatus === 'drop' }">下拉刷新</span>
                <span v-show="topStatus === 'loading'">刷新中...</span>
            </div>
        </mt-loadmore>
methods: {
            handleTopChange(status) {
                this.topStatus = status;
                console.log(status + '下拉刷新')

            },
            handleBottomChange(status) {
                console.log(status + '上拉加载')

            },
            loadTop() {
                console.log('执行刷新')
                this.$refs.loadmore.onTopLoaded();
            },
            onTopLoaded() {
                console.log('刷新方法执行')
            },
            loadBottom() {
                console.log('上拉加载执行')
                // 加载更多数据
                // this.allLoaded = true;// 若数据已全部获取完毕
                this.$refs.loadmore.onBottomLoaded();
            },
            onBottomLoaded() {
                console.log('加载方法执行')
            },
            goPath() {
                this.$router.push({path: '/card'});
            },
            goBack() {
                this.$router.back(-1)
            }
        },

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<template>
    <section style="display: flex;height: 100%;flex-direction: column;">
        <x-header title="slot:overwrite-title" :left-options="{backText: ''}" style="background-color:#FFFFFF;">
            <div class="xheader-title" slot="overwrite-title" color="#333333;">首页</div>
        </x-header>
        <div class="main">
            <div class="r1">单位:元</div>
            <div class="r2">
                <mt-loadmore
                        :top-method="loadTop"
                        :bottom-method="loadBottom"
                        :bottom-all-loaded="allLoaded"
                        ref="loadmore"
                        @top-status-change="handleTopChange"
                        @bottom-status-change="handleBottomChange"
                        bottomPullText="上拉加载"
                        bottomDropText="加载更多"
                        bottomLoadingText="加载中...">
                    <div class="billlist">
                        <div class="bill" v-for="(i,index) in test" :key="index">
                            <div class="billr1">
                                <div>入款</div>
                                <div>100.00{{i}}</div>
                            </div>
                            <div class=" billr2">
                                <div>2018-11-23 11:03:03</div>
                                <div style="color: #005BAC">失败</div>
                            </div>
                        </div>

                    </div>
                    <div slot="top" class="mint-loadmore-top">
                        <span v-show="topStatus !== 'loading'" :class="{ 'rotate': topStatus === 'drop' }">下拉刷新</span>
                        <span v-show="topStatus === 'loading'">刷新中...</span>
                    </div>
                </mt-loadmore>
            </div>


            <div class="bottom">
                <div class="service">
                    <div class="from">底部</div>
                    <div class="phone">123456</div>
                </div>
            </div>
        </div>
    </section>
</template>
<script>
    import {XHeader} from 'vux';
    import {Toast, Loadmore} from 'mint-ui';

    export default {
        components: {
            XHeader,
        },
        data() {
            return {
               
                test: 10,
            }
        },
        methods: {

          

            handleTopChange(status) {
                this.topStatus = status;
                console.log(status + '下拉刷新')

            },
            handleBottomChange(status) {
                console.log(status + '上拉加载')

            },
            loadTop() {
                console.log('执行刷新')
                this.$refs.loadmore.onTopLoaded();
            },
            onTopLoaded() {
                console.log('刷新方法执行')
            },
            loadBottom() {
                console.log('上拉加载执行')
                this.test = this.test + 10;

                if (this.test > 30) {
                    this.allLoaded = true;
                }
                // 加载更多数据
                // this.allLoaded = true;// 若数据已全部获取完毕
                this.$refs.loadmore.onBottomLoaded();
            },
            onBottomLoaded() {
                console.log('加载方法执行')
            },


        },
        mounted() {

        },
    }
</script>
<style lang="scss" scoped>
    .main {
        border-top: 1px solid #B2B2B2;
        .r1 {
            display: flex;
            justify-content: flex-end;
            margin-right: 14px;
            color: #8B9094;
            margin-top: 9px;
            margin-bottom: 10px;
        }
        .r2 {
            margin-bottom: -116px;
            .billlist {

                padding-left: 15px;
                padding-right: 15px;
                background-color: white;
                .bill {
                    padding-top: 15px;
                    margin-bottom: 15px;

                    .billr1 {
                        display: flex;
                        justify-content: space-between;
                    }
                    .billr2 {
                        color: #8B9094;
                        margin-top: 8px;
                        display: flex;
                        justify-content: space-between;
                        padding-bottom: 7px;
                        border-bottom: 1px solid rgba(191, 191, 191, 0.81);
                    }

                }
            }
        }
        .bottom {
            bottom: 0px;
            margin-bottom: 20px;
            margin-top: 130px;
            width: 100%;
            .buy-button {
                margin: 0 15px;
                margin-bottom: 43px;
                height: 49px;
                line-height: 49px;
                text-align: center;
                background: rgba(255, 255, 255, 1);
                border: 1px solid rgba(0, 91, 172, 1);
                border-radius: 24px;

                span {
                    font-size: 18px;
                    font-weight: 500;
                    color: #005BAC;
                }
            }

            .service {
                text-align: center;

                .from {
                    font-size: 12px;
                    font-weight: 400;
                    color: rgba(90, 96, 101, 1);
                }

                .phone {
                    font-size: 12px;
                    font-weight: 400;
                    color: rgba(90, 96, 101, 1);

                    span {
                        color: #629DD2;
                    }
                }
            }
        }
    }
</style>


### Vue实现上拉加载更多的触发事件 在 Vue实现上拉加载更多功能,可以通过多种方式完成。以下是几种常见的方式及其具体实现: #### 方法一:基于 Mint UI 的 `pullingUp` 事件 Mint UI 提供了一个内置的 `pullingUp` 事件来支持上拉加载更多操作。开发者可以利用该事件监听用户的上拉行为并触发相应的逻辑。 ```javascript this.scroll.on('pullingUp', () => { this.$emit('pullingUp'); // 将事件传递给父组件或其他地方处理 }); ``` 这种方式依赖于 Mint UI 组件库中的滚动视图组件[^1]。通过绑定 `pullingUp` 事件,可以在用户触底时自动发起网络请求以加载新数据。 --- #### 方法二:使用 Vue 的无限滚动指令 (`v-infinite-scroll`) Vue 可以借助第三方插件或者原生指令实现无限滚动效果。例如,Mint UI 或其他框架提供了类似的指令支持。 ```html <ul v-infinite-scroll="loadMore" infinite-scroll-disabled="loading" infinite-scroll-distance="40"> <!-- 列表项 --> </ul> ``` 在这个例子中,`v-infinite-scroll` 是一个自定义指令,当滚动条接近底部一定距离(由 `infinite-scroll-distance` 定义)时会调用 `loadMore` 方法[^2]。同时,`infinite-scroll-disabled` 属性控制是否禁用此功能,通常用于防止重复加载。 --- #### 方法三:手动监听滚动事件 如果不希望引入额外的库,则可以选择直接监听 DOM 元素的滚动事件,并计算其位置判断何时触发加载动作。 ```javascript methods: { handleScroll() { const scrollTop = document.documentElement.scrollTop || document.body.scrollTop; const windowHeight = window.innerHeight; const documentHeight = document.documentElement.scrollHeight; if (scrollTop + windowHeight >= documentHeight - 50) { // 距离底部还有 50px 时触发 this.loadMore(); } }, loadMore() { console.log("正在加载更多..."); // 执行异步请求更新列表... } }, mounted() { window.addEventListener('scroll', this.handleScroll); }, beforeDestroy() { window.removeEventListener('scroll', this.handleScroll); } ``` 这种方法完全不依赖外部工具,灵活性较高,但也需要自行管理性能优化等问题[^3]。 --- #### 方法四:结合 uni-app 实现上下拉交互 对于跨平台开发项目而言,uni-app 支持内置的 `onPullDownRefresh()` 和 `onReachBottom()` 钩子函数分别用来响应下拉刷新与到达页面底部的行为。 ```javascript const searchFrom = ref({ pageNum: 1, pageSize: 5 }); // 上拉加载更多 function getVisitList() { setTimeout(() => { let newData = Array.from({ length: 5 }, (_, i) => ({ id: Math.random().toString(36).substr(2), name: 'Item' + ((searchFrom.value.pageNum - 1) * searchFrom.value.pageSize + i + 1) })); if (newData.length === 0) { pageFlag.value = true; // 表明已无更多数据可加载 } else { visitData.value.push(...newData); searchFrom.value.pageNum += 1; } uni.stopPullDownRefresh(); // 停止当前刷新动画 }, 1000); } export default { setup() { return { searchFrom, pageFlag, visitData, getVisitList }; }, onReachBottom() { if (!pageFlag.value) { getVisitList(); } } }; ``` 这段代码展示了如何动态增加分页参数以及终止条件下的处理流程[^5]。 --- ### 总结 以上四种方案各具特色,可以根据实际需求选择合适的技术路线: - 如果追求简单快捷,推荐采用成熟的前端框架如 Mint UI; - 对于更复杂的业务场景则建议考虑手写逻辑配合 Intersection Observer API 进一步提升效率; - 在小程序领域内优先选用官方提供的生命周期钩子简化编码工作量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值