Vue 移動端向上滑動加載


        Vue搭配上 Element 還是挺香的,對於手機端顯示集合數據的時候,受到界面大小的限制,自然是不能用分頁來展示,一般主流選擇是點擊加載,或者向上滑動屏幕加載,說白了,這種機制與 下一頁的功能類似,區別在於將下一頁的數據追加到當前數據中,僅此而已,話不多說,這里先構造下前端的界面。如下所示,僅僅遍歷數據后面加了一個 滾動的div,然后通過 v-if 來判斷是否顯示哪一個. 

<div id="app">
    <div style="background-color:#4caf50;height:44px;" class="mid">
        <span style="color:white;width:100%">簽到統計</span>
        <span style="color:white;margin-right:10px" v-on:click="goBack"><i class="el-icon-close"></i></span>
    </div>
    <div  style="overflow:auto">
        <div>
            <template>
                <div v-for="item in items">
                    <el-row>
                        <div style="border-radius: 8px;background-color:#e4e4e4;text-align:center;margin:10px 5% 10px 5%;padding:8px">
                            <table style="width:100%">
                                <tr>
                                    <td width="25%">{{item.Name}}</td>
                                    <td width="25%" style="color:red">{{item|FilerGo}}</td>
                                    <td width="25%">{{item.ClassName}}</td>
                                    <td width="25%">{{item.Score}}</td>
                                </tr>
                            </table>
                        </div>
                    </el-row>
                </div>
            </template>
        </div>
        <div style="text-align:center">
            <el-link v-if="loading" type="success">向上滑動加載更多</el-link>
            <el-link v-else type="success">已經到底了~</el-link>
        </div>
    </div>
</div>

如上,這里是一個表格,將后端請求的數據 賦值給  items ,在請求數據之前,將當前頁碼記錄下來,每滾動一次,此頁碼+1,當做參數傳遞給后台,同時還有每頁顯示的條數也要作為參數來處理。拿到后台返回的數據之后,將總頁數與當前頁進行比較,判斷前面是否顯示繼續滾動或者已經到底。這里需要處理的給屏幕滾動的監聽事件綁定一個方法 window.addEventListener('scroll', this.FuncScroll); ,用來進一步判斷是否滑動時觸發請求數據的方法 

    <script type="text/javascript">
//定義全局變量,來處理滾動請求 var tbol = true; var vm = new Vue({ el: '#app', data: { items: [], CurrTime: "", loading: false, pages: 1, currentPage: 0, }, mounted: function () {
//初始化,第一次加載數據 this.InitFunc();
//監聽當前屏幕滾動事件 window.addEventListener(
'scroll', this.FuncScroll); }, methods: { goBack: function () { window.history.go(-1); }, InitFunc: function () { let vm = this; var currPage = vm.currentPage + 1; //后端請求數據 $.post("/WeChat/Kiaser/GetDate", { pageNum: currPage, pageSize: 4 }, function (data) { let pageInfo = data.Kiaser; let search = data.Search; pageInfo.forEach(function (item) { vm.items.push(item); });
//獲取當個頁碼 vm.currentPage
= search.PageIndex;
//當前頁碼與總頁碼進行比對 vm.loading
= vm.currentPage < search.TotalPage;
//根據手速來選擇間刷新速度 setTimeout(
function () {tbol = true;},2200); }, "JSON"); }, FuncScroll: function (e) {
//獲取屏幕滾動高度
var top = e.srcElement.scrollingElement.scrollTop;
//滿足滑動高度以及數據未加載完時,調用加載下一頁數據方法 if (top > 120 && this.loading && tbol) { tbol = false; this.InitFunc(); } } }, }) </script>

按照思路,一路寫下來,調試的時候還是有幾點需要注意的,文中已標紅

第一: 滑動的時候請求多次,導致界面數據加載重復

第二: 滑動時候一次把所有頁碼數據加載完 

針對第一點,滑動的時候,后台請求是異步的,對於是否加載到底的值獲取是不及時,會導致一直刷,后台一直被請求

針對第二點,當加入臨時的一個bool 值來處理的時候,雖然不會導致冗余請求,但會感覺像一次性數據被全部加載完,體驗感不是很好,這里我的處理方式時,在拿到異步數據后,延遲對臨時bool 值進行賦值,這樣對於手機來講,沒滾動一次,加載一次的效果更明顯

說了這么多,展示一下界面完畢時效果

    

如果不需要向上滑動加載,而是點擊元素 “加載更多” 時去觸發加載下一頁,只需要給加載更多的綁定請求后台數據的click 方法即可。沒必要去監聽屏幕滾動事件,以及臨時變量 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM