美文网首页项目
koa2案例实现:平滑滚动、上拉加载更多、下拉刷新功能

koa2案例实现:平滑滚动、上拉加载更多、下拉刷新功能

作者: 似朝朝我心 | 来源:发表于2021-05-16 21:51 被阅读0次

项目需求:koa2+vue+axios+better-scroll+json,其中vue+axios+better-scroll我采用的都是脚本引入,json数据模仿数据库。


better-scroll平滑滚动框架,又叫better-scroll滑动库。

其实就像uni-app的scroll-view组件

官网:https://github.com/ustbhuangyi/better-scroll/blob/master/README_zh-CN.md

这里我们就不使用npm安装了,直接使用脚本的形式引入资源。



复制cdn的网址到浏览器打开,然后全选复制,到自己项目中创建一个js文件命名为better-scroll.js保存下来。


案例效果
下拉刷新的实现


上拉加载更多的实现

上拉触底(没有更多数据了)

页面初始加载

实现代码逻辑

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <link rel="stylesheet" type="text/css" href="./stylesheets/style.css" />
        <script src="./javascripts/axios.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="./javascripts/vue.js" type="text/javascript" charset="utf-8"></script>
        <script src="./javascripts/better-scroll.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <header id="sports-header">
            90Sports | 体育
        </header>
        <div id="loadingDown"></div>
        <main id="sports-main">
            <div>
                <ul class="sports-list">
                    <li v-for="item in SportsList" :key="item.id">
                        <div class="sports-list-text">
                            <p>
                                {{ item.title }}
                            </p>
                            <p>
                                <span>{{ item.comment }}评</span>
                            </p>
                        </div>
                        <div class="sports-list-img">
                            <img :src="item.image" alt="">
                        </div>
                    </li>
                </ul>
                <div id="loadingUp"></div>
            </div>
            <div id="loading" style="font-size: 20px;color: #537BFF;"></div>
        </main>

        <script type="text/javascript">
            const app = new Vue({
                data() {
                    return {
                        SportsList: []
                    }
                },
                mounted() {
                    this.getMsg()
                },
                methods: {
                    getMsg: function() {
                        /*  
                            方法1:使用传统的ajax发起请求的写法
                            const xhr = new XMLHttpRequest()
                            let that = this
                            xhr.onload = function() {
                                if (xhr.status == 200) { //判断状态码
                                    //console.log(xhr.responseText
                                    let data = JSON.parse(xhr.responseText) //用data接收服务器响应回来的json数据
                                    if (data.errCode == 0) { //判断证明一下是不是ok状态
                                        console.log(data.sportsList)
                                        that.SportsList = data.sportsList
                                        console.log(that.SportsList)
                                    }
                                }
                            }
                            xhr.open('POST', '/sportsList', true) //发送POST请求,请求URL,开启异步加载
                            xhr.setRequestHeader('Content-Type', 'application/json') //设置请求头信息,json何使
                            xhr.send(JSON.stringify({
                                "page": 0,
                                "count": 10
                            })) //转义json数据
                        */

                        //方法2:使用axios发起请求               
                        axios.post('/sportsList', {
                            page: 0,
                            count: 10
                        }).then(res => {
                            console.log(res)
                            if (res.data.errCode == 0) { //判断证明一下是不是ok状态
                                //console.log(res.data)

                                //初始化完成后
                                loading.innerHTML = 'loading...'
                                setTimeout(() => {
                                    this.SportsList = res.data.sportsList
                                    this.initBetterScroll(); //数据回来的时候调用initBetterScroll,用来初始化操作                    
                                }, 1000)                
                            }
                        })
                    },
                    //页面初始化
                    initBetterScroll() {
                        let page = 0 //控制页码
                        let loadingDown = document.getElementById('loadingDown')
                        let loadingUp = document.getElementById('loadingUp')
                        let loading = document.getElementById('loading')
                        let container = document.getElementById("sports-main") //获取容器
                        loading.innerHTML = ''
                                        
                        let bs = BetterScroll.createBScroll(container, { //创建一个BetterScroll实例,然后可以调用该实例下的方法
                            pullDownRefresh: { //下拉功能
                                threshold: 30 //临界点,单位px
                            },
                            //上拉加载
                            pullUpLoad: {
                                threshold: -10
                            }
                        })
                        //触发下拉临界点事件pullingDown
                        bs.on('pullingDown', () => {
                            console.log('下拉')
                            loadingDown.innerHTML = 'loading...' //下拉前显示
                            axios.post('/sportsList', {
                                page: 0,
                                count: 10
                            }).then(res => {
                                if (res.data.errCode == 0) {
                                    //延迟1秒后完成下拉刷新
                                    setTimeout(() => {
                                        this.SportsList = res.data.sportsList
                                        loadingDown.innerHTML = '刷新成功' //下拉完成后显示
                                        bs.finishPullDown();
                                        bs.refresh(); //重新刷新一下页面
                                        num = 0
                                    }, 1000)
                                }
                            })
                        });
                        //触发上拉临界点事件pullingUp
                        bs.on('pullingUp', () => {
                            console.log('上拉')
                            loadingUp.innerHTML = 'loading...'
                            axios.post('/sportsList', {
                                page: ++page, //累加,下拉一页
                                count: 10
                            }).then(res => {
                                if (res.data.errCode == 0) {
                                    //延迟1秒后完成下拉刷新
                                    setTimeout(() => {
                                        this.SportsList = [...this.SportsList, ...res.data.sportsList] //上拉的时候加载1页数据
                                        if (res.data.sportsList.length<10) {
                                            
                                            loadingUp.innerHTML = '已经没有更多数据了'
                                        } else {
                                            loadingUp.innerHTML = '刷新成功'
                                            
                                        }
                                        bs.finishPullUp();
                                        bs.refresh(); //重新刷新一下页面
                                    }, 1000)
                                }
                            })
                        })
                        //触发滚动瞬间的事件scrollStart
                        bs.on('scrollStart', () => {
                            console.log('滚动')
                            loadingDown.innerHTML = '下拉刷新' //下拉过程中显示
                            loadingUp.innerHTML = '上拉加载'
                        })
                    }
                }
            }).$mount('#sports-main')
        </script>
    </body>
</html>

完整案例项目:https://gitee.com/qin-fubin/demo-collect/tree/sportProject/

相关文章

网友评论

    本文标题:koa2案例实现:平滑滚动、上拉加载更多、下拉刷新功能

    本文链接:https://www.haomeiwen.com/subject/fvcsmktx.html