使用Vue簡(jiǎn)單實(shí)現(xiàn)一個(gè)上拉加載更多分頁(yè)組件
效果展示

體驗(yàn)地址
jyeontu.xyz/jvuewheel/#/JPageContentView

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

