uniapp自定義下拉刷新組件項目實踐總結(jié)分析
準備工作
- 在
components新建一個q-pull文件夾,并新建一個q-pull.vue的組件; - 按照前面文章所說的頁面結(jié)構(gòu),編寫好預(yù)定的自定義下拉刷新組件頁面;
原理分析
自定義下拉刷新就是在之前自定義滑動觸摸組件的基礎(chǔ)上,在頂部增加一個刷新的模塊。
在頁面下拉的時候,判斷是否為下滑的方向,如果是就獲取數(shù)據(jù),數(shù)據(jù)請求完成后,隱藏刷新模塊即可。
組件實現(xiàn)
準備工作和原理分析完成后,接下來寫一個簡單的組件。
模板部分
這部分主要是顯示動畫、提示、顏色、背景色以及控制是否展示頁面。
<view class="pull">
<view
id="pull-container"
:style="pullInfo.style"
ref="pullBox"
@touchstart="handlerStart"
@touchmove="handlerMove"
@touchend="handlerEnd">
<view class="pull-head">
<view class="pull-text"> {{ pullInfo.tipText }} </view>
</view>
<view class="pull-body">
<slot></slot>
</view>
</view>
</view>樣式部分
.pull {
position: relative;
width: 100%;
height: 100%;
#pull-container {
position: relative;
width: 100%;
height: 100%;
.pull-head {
position: absolute;
left: 0;
top: 0;
width: 100%;
text-align: center;
transform: translateY(-100%);
.pull-text {
padding: 30rpx 0;
color: $mainColor;
font-size: 26rpx;
background: $f8;
font-weight: bold;
}
}
.pull-body {
box-sizing: border-box;
padding: 60rpx;
text-align: left;
font-size: 28rpx;
}
}
}腳本部分
- 引入依賴
// 導入依賴
import { reactive } from "vue";
// 頁面屬性
// 下拉刷新
const pullInfo = reactive({
style: {},
tipText: "",
startY: 0,
deltaY: 0,
slowY: 0,
resetTimer: null,
resetTime: 500,
});
// 發(fā)送事件
const emits = defineEmits(["load"]);- 開始下拉
function handlerStart(e) {
let startY = e.touches[0].pageY;
pullInfo.style = "transition: transform 0s";
}- 下拉移動
function handlerMove(e) {
e.preventDefault();
pullInfo.deltaY = e.touches[0].pageY - pullInfo.startY;
if (pullInfo.deltaY > 0) {
pullInfo.tipText = "下拉刷新";
if (pullInfo.deltaY > 60) {
pullInfo.tipText = "松開刷新";
pullInfo.slowY = (pullInfo.deltaY - 60) * 0.2 + 60;
} else {
pullInfo.slowY = pullInfo.deltaY;
}
pullInfo.style = `transform: translateY(${pullInfo.slowY * 2}rpx)`;
}
}- 下拉結(jié)束
function handlerEnd(e) {
pullInfo.style = "transition: transform .5s";
if (pullInfo.deltaY > 60) {
pullInfo.tipText = "正在加載中...";
pullInfo.style = "transform: translateY(95rpx)";
emits("load");
} else {
pullInfo.style = "transform: translateY(0)";
}
}- 復(fù)位
function reset() {
pullInfo.resetTimer = setTimeout(() => {
pullInfo.tipText = "刷新成功!";
pullInfo.resetTimer = setTimeout(() => {
pullInfo.style = "transform: translateY(0)";
clearTimeout(pullInfo.resetTimer);
}, pullInfo.resetTime);
}, pullInfo.resetTime);
}實戰(zhàn)演練
模板使用
<q-pull
ref="myPull"
@load="loadSet">
<!-- 插槽內(nèi)容 -->
<view>
<view
v-for="(item, index) in pull.list"
:key="index"
>{{item}}</view
>
</view>
</q-pull>腳本使用
定義數(shù)據(jù)
// 列表
const pull = reactive({
list: [1, 2, 3, 4, 5, 6],
});加載內(nèi)容
function loadSet() {
// 請求數(shù)據(jù)
setTimeout(() => {
let num = Math.random() * 100;
pull.list.push(num);
if (proxy.$refs.myPull) {
proxy.$refs.myPull.reset();
}
}, 3000);
}內(nèi)置刷新
uniapp 也為我們開發(fā)者準備了內(nèi)置下拉刷新,一起去看看如何使用吧。
引入配置
在pages.json文件中找到需要下拉刷新的頁面中加入以下配置。
{
"path": "pages/index/pull-refresh",
"style": {
"navigationBarTitleText": "下拉刷新",
"enablePullDownRefresh": true
}
}可以在 APP 端自定義樣式,在enablePullDownRefresh下面添加如下配置:
{
//...
"app-plus": {
"pullToRefresh": {
"support": true,
"color": "#24afd6",
"style": "circle"
}
}
// ...
}頁面引入
import { onPullDownRefresh } from "@dcloudio/uni-app";監(jiān)聽下拉刷新
// 監(jiān)聽下拉刷新
onPullDownRefresh(() => {
// 開始下拉刷新
uni.startPullDownRefresh();
// 獲取數(shù)據(jù)
getData();
});停止下拉刷新
// 獲取數(shù)據(jù)
function getData() {
console.log("獲取數(shù)據(jù)!");
setTimeout(() => {
uni.stopPullDownRefresh();
}, 3000);
}案例展示
自定義組件
h5 端效果

小程序端效果

APP 端效果

內(nèi)置下拉刷新
h5 端效果

小程序端效果

APP 端效果

以上就是uniapp自定義下拉刷新組件項目實踐總結(jié)分析的詳細內(nèi)容,更多關(guān)于uniapp自定義下拉刷新組件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
TypeScript?Pinia實戰(zhàn)分享(Vuex和Pinia對比梳理總結(jié))
這篇文章主要介紹了TypeScript?Pinia實戰(zhàn)分享(Vuex和Pinia對比梳理總結(jié)),今天我們再來實戰(zhàn)下官方推薦的新的vue狀態(tài)管理工具Pini,感興趣的小伙伴可以參考一下2022-06-06
Javascript & DHTML DOM基礎(chǔ)和基本API
DOM是文檔對象模型(Document Object Model,是基于瀏覽器編程(在本教程中,可以說就是DHTML編程)的一套API接口,W3C出臺的推薦標準,每個瀏覽器都有一些細微的差別,其中以Mozilla的瀏覽器最與標準接近。2008-07-07
Js生成隨機數(shù)/隨機字符串的方法小結(jié)【5種方法】
這篇文章主要介紹了Js生成隨機數(shù)/隨機字符串的方法,結(jié)合實例形式總結(jié)分析了5種Js生成隨機數(shù)/隨機字符串的操作技巧,需要的朋友可以參考下2020-05-05
JS中mouseover和mouseout多次觸發(fā)問題如何解決
這篇文章主要介紹了JS中mouseover和mouseout多次觸發(fā)問題如何解決的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-06-06
UNIAPP實現(xiàn)微信小程序登錄授權(quán)和手機號授權(quán)功能(uniapp做微信小程序)
uniapp開發(fā)小程序,先授權(quán)用戶信息后再出現(xiàn)手機號授權(quán)的頁面進行手機號授權(quán),完成后返回上一頁面并把信息存入后臺以及前臺緩存中,方便使用,這篇文章主要介紹了UNIAPP實現(xiàn)微信小程序登錄授權(quán)和手機號授權(quán)(uniapp做微信小程序),需要的朋友可以參考下2024-08-08
關(guān)于javascript中偽數(shù)組和真數(shù)組的一些小秘密
在javascript中,偽數(shù)組又稱類數(shù)組,是一個類似數(shù)組的對象,是一種按照索引存儲數(shù)據(jù)且具有l(wèi)ength屬性的對象,下面這篇文章主要給大家介紹了關(guān)于javascript中偽數(shù)組和真數(shù)組的一些小秘密,需要的朋友可以參考下2022-08-08
JavaScript中通過prototype屬性共享屬性和方法的技巧實例
這篇文章主要介紹了JavaScript中通過prototype屬性共享屬性和方法的技巧實例,本文直接給出一個代碼實例,需要的朋友可以參考下2015-03-03
javascript removeChild 導致的內(nèi)存泄漏
最近看到司徒正美的一篇文章《移除DOM節(jié)點》,文中說到在IE中移除容器類節(jié)點,會引起內(nèi)存泄露。2010-08-08

