使用Vue簡單實現(xiàn)一個上拉加載更多分頁組件
效果展示
體驗地址
jyeontu.xyz/jvuewheel/#/JPageContentView
實現(xiàn)思路
1、組件模板結(jié)構
<template> <div class="j-page-content" ref="scrollable" @scroll="handleScroll"> <slot></slot> <div v-if="loading" class="loading-indicator">{{ moreText }}</div> </div> </template>
- 可滾動容器:最外層是一個內(nèi)容容器,并且設置了
@scroll
事件監(jiān)聽器,當用戶滾動這個容器時,會觸發(fā)handleScroll
方法。 - 內(nèi)容插槽:
<slot>
元素用于接收外部傳入的內(nèi)容。這意味著使用者可以在使用該組件時,將需要展示的列表項或者其他內(nèi)容放置在這個組件內(nèi)部,靈活性很高。 - 加載提示:當
loading
為true
時,會顯示一個帶有加載文本的div
。加載文本通過moreText
屬性傳入,默認值為 "加載中..."。這個加載提示元素位于容器底部。
2、組件屬性(props)
props: { moreText: { type: String, default: "加載中...", }, threshold: { type: String, default: "20", }, }
- moreText:用于定義加載提示文本的內(nèi)容。外部使用者可以根據(jù)自己的應用場景和語言需求,自定義這個文本。
- threshold:用于設置判斷接近容器底部的閾值。默認值為 "20",它表示當距離容器底部的距離小于等于這個閾值時,觸發(fā)加載更多的操作。這個值可以根據(jù)實際的設計需求和視覺效果進行調(diào)整。
3、組件數(shù)據(jù)(data)
data() { return { loading: false, isNearBottom: false, scrollableElement: null, isloading: false, }; }
- loading:用于表示當前是否正在加載更多數(shù)據(jù)。初始值為
false
,當觸發(fā)加載更多操作時,設置為true
,加載完成后再重置為false
。 - isNearBottom:用于判斷是否接近容器底部。通過在滾動事件處理中計算得到,初始值為
false
。 - scrollableElement:用于存儲可滾動容器的引用。在組件掛載(
mounted
)階段獲取到對帶有ref="scrollable"
的div
的引用。 - isloading:這是一個額外的加載狀態(tài)標識,用于在加載過程中防止多次觸發(fā)加載更多操作。初始值為
false
,在觸發(fā)加載更多操作時設置為true
,并在加載完成后的短暫延遲后重置為false
。
4、組件生命周期(mounted)
mounted() { this.scrollableElement = this.$refs.scrollable; }
這里通過 this.$refs.scrollable
獲取到在模板中定義的可滾動容器的引用,并將其賦值給 scrollableElement
,以便在后續(xù)的滾動事件處理中使用。
5、組件方法(methods)
(1) handleScroll 方法
handleScroll() { if (this.isloading) return; const scrollTop = this.scrollableElement.scrollTop; const clientHeight = this.scrollableElement.clientHeight; const scrollHeight = this.scrollableElement.scrollHeight; // 判斷是否接近底部 this.isNearBottom = scrollTop + clientHeight >= scrollHeight - this.threshold; if (this.isNearBottom &&!this.loading) { this.loading = true; this.isloading = true; this.$emit("loadMore"); } }
- 首先,該方法會檢查
isloading
的狀態(tài),如果正在加載(isloading
為true
),則直接返回,避免多次觸發(fā)加載操作。 - 然后,獲取可滾動容器的當前滾動位置(
scrollTop
)、可視區(qū)域高度(clientHeight
)以及整個可滾動內(nèi)容的高度(scrollHeight
)。通過計算判斷是否接近底部(scrollTop + clientHeight >= scrollHeight - this.threshold
)。 - 如果接近底部且當前沒有在加載(
!this.loading
),則將loading
和isloading
都設置為true
,并通過this.$emit("loadMore")
向外拋出一個名為loadMore
的自定義事件。父組件可以監(jiān)聽這個事件來執(zhí)行加載更多數(shù)據(jù)的操作。
(2)loadMoreComplete 方法
loadMoreComplete() { this.loading = false; setTimeout(() => { this.isloading = false; }, 100); }
當父組件完成加載更多數(shù)據(jù)的操作后,應該調(diào)用這個方法。它首先將 loading
設置為 false
,表示加載操作已完成。然后,通過 setTimeout
設置一個 100 毫秒的延遲后,將 isloading
也設置為 false
。這樣的延遲是為了確保在加載完成后的短暫時間內(nèi)不會再次觸發(fā)加載更多操作,避免可能出現(xiàn)的問題。
組件使用
<template> <div class="content" style="height: 500px"> <JPageContent @loadMore="loadMoreData" ref="JPageContent"> <div v-for="n in nums" :key="n"> <div style=" height: 100px; width: 400px; text-align: center; line-height: 100px; border: 1px solid gray; " > JPageContent-{{ n }} </div> </div> </JPageContent> </div> </template> <script> export default { data() { return { nums: 10, } }, methods: { loadMoreData() { if (this.nums >= 30) { this.$refs.JPageContent.loadMoreComplete(); return; } setTimeout(() => { this.nums += 10; this.$refs.JPageContent.loadMoreComplete(); }, 1000); } } } </script>
組件庫
組件文檔
目前該組件也已經(jīng)收錄到我的組件庫,組件文檔地址如下: jyeontu.xyz/jvuewheel/#/JPageContentView
到此這篇關于使用Vue簡單實現(xiàn)一個上拉加載更多分頁組件的文章就介紹到這了,更多相關Vue分頁組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
ElementUI實現(xiàn)el-table列寬自適應的代碼詳解
這篇文章給大家介紹了ElementUI實現(xiàn)el-table列寬自適應的詳細步驟,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-01-01vue-element-admin中node-sass換成dart-sass,安裝依賴報code?128多種問題的解決
這篇文章主要介紹了vue-element-admin中node-sass換成dart-sass,安裝依賴報code?128多種問題的解決方法,本文給大家分享問題原因分析及解決方法,需要的朋友可以參考下2023-02-02vue結(jié)合el-upload實現(xiàn)騰訊云視頻上傳功能
這篇文章主要介紹了vue結(jié)合el-upload實現(xiàn)騰訊云視頻上傳功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07在Vue3中實現(xiàn)四種全局狀態(tài)數(shù)據(jù)的統(tǒng)一管理的方法
在開發(fā)中,通常遇到四種全局狀態(tài)數(shù)據(jù):異步數(shù)據(jù)、同步數(shù)據(jù),傳統(tǒng)的Vue3使用不同機制處理這些數(shù)據(jù),而Zova框架通過Model機制來統(tǒng)一管理,簡化了數(shù)據(jù)處理流程,提高了代碼的可維護性,本文介紹在Vue3中實現(xiàn)四種全局狀態(tài)數(shù)據(jù)的統(tǒng)一管理的方法,感興趣的朋友一起看看吧2024-10-10element-ui重置resetFields()不生效的解決
本文主要介紹了element-ui重置resetFields()不生效的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-12-12