uni-app App端內置了一個基於 weex 改進的原生渲染引擎,提供了原生渲染能力。
在App端,如果使用vue頁面,則使用webview渲染;如果使用nvue頁面(native vue的縮寫),則使用原生渲染。
list是app端nvue專用組件,詳細介紹在官網https://uniapp.dcloud.io/component/list?id=list
1、下拉刷新和觸底加載
<refresh> 組件為容器提供下拉刷新功能,
<refresh> 提供兩個事件=》
pullingdown:被下拉時觸發;refresh :被下拉完成時觸發(理解為touchend 時)
<list>提供一個事件,和一個屬性設定觸底加載的距離
loadmore:列表滾動到底部將會立即觸發這個事件,你可以在這個事件的處理函數中加載下一頁的列表項。 如果未觸發,請檢查是否設置了loadmoreoffset的值,建議此值設置大於0;
loadmoreoffset:觸發 loadmore 事件所需要的垂直偏移距離(設備屏幕底部與 list 底部之間的距離);
<template>
<view class="list">
<!-- list組件必須顯示的指定寬高,或者使用定位方式 -->
<list class="list" loadmoreoffset="10" @loadmore="loadMore" ref="list">
<refresh
:display="refreshing ? 'show' : 'hide'"
@refresh="onrefresh"
@pullingdown="onpullingdown"
@click="reFresh">
<view class="loading-more">
<loading-indicator style="margin-right:15px;"></loading-indicator>
<text class="loading-more-text">{{refreshText}}</text>
</view>
</refresh>
<cell v-for="(item,index) in list"
:key="index"
:ref="'cell'+index">
<view class="cell">
<text>{{item}}</text>
</view>
</cell>
<cell v-if="list.length>8 && !noData">
<view class="loading-more">
<loading-indicator style="margin-right:15px;"></loading-indicator>
<text class="loading-more-text">加載中...</text>
</view>
</cell>
<cell v-if="noData">
<view class="loading-more">
<text class="loading-more-text">沒有更多數據了</text>
</view>
</cell>
</list>
<view class="top" style="bottom: 150px;" @click="reLoad">
<text>刷新</text>
</view>
<view class="top" @click="clickTop()">
<view style="background-color: pink;" @click.stop="toTop(1,$event)">
<text>toTop</text>
</view>
</view>
</view>
</template>
<script>
//只在nvue 頁面有該模塊
const dom = weex.requireModule('dom')
export default {
data() {
return {
list: [1, 2, 3, 4, 5, 6,7,8],
noData:false,
refreshText:'',
loading:false,
refreshing:false
}
},
methods: {
//開始下拉時
onpullingdown(e){
//當正在刷新的時候直接返回
if(this.refreshing){
return;
}
if (Math.abs(e.pullingDistance) > Math.abs(e.viewHeight)) {
//當下拉的距離大於fresh組件的高度
this.refreshText = "釋放立即刷新";
} else {
this.refreshText = "下拉可以刷新";
}
},
onrefresh(){
if(this.loading){
//當正在調用接口獲取數據時,此時的下拉不做任何操作
return;
}
this.refreshText="正在刷新...";
//刷新數據
//模擬接口延遲
this.loading = true;
this.refreshing = true;
//刷新成功
setTimeout(()=>{
this.list = [1,2,3,4,5,6,7,8];
this.loading = false;
this.refreshing = false;
this.loadErr = false;
},300);
//模擬刷新失敗
// setTimeout(()=>{
// this.loading = false;
// this.refreshText = '刷新失敗,點擊重試';
// this.loadErr = true;
// },300);
},
reFresh(){
if(!this.loadErr){
return;
}
this.refreshText="正在刷新...";
setTimeout(()=>{
this.list = [1,2,3,4,5,6,7,8];
this.loading = false;
this.refreshing = false;
this.loadErr = false;
},300);
},
loadMore(){
let data = [];
let v = this.list[this.list.length-1];
if(v==200){
this.noData = true;
return;
}
for(let i = 0;i<4;i++){
v++;
data.push(v);
}
//模擬接口返回時間延遲
setTimeout(()=>{
this.list = this.list.concat(data);
},300);
},
reLoad(){
//當屏幕已經向下滾動,此時刷新,如果數據超過一屏,此時滾動條不會自動置頂
this.list = [1,2,3,4,5,7,8,9];
this.scrollElement(0);
},
toTop(params,e){
//nvue下阻止事件冒泡的方法
e.stopPropagation()
this.scrollElement(0);
},
//滾動到某一個元素
scrollElement(index){
if (this.$refs['cell'+index]) {
//滑動到頂部
let el = this.$refs['cell'+index][0];
dom && dom.scrollToElement(el, {
// animated:false //滾動的動畫,默認有
});
}
},
clickTop(e){
uni.showToast({
title:'事件冒泡了'
})
}
}
}
</script>
<style>
.list{
position: absolute;
top:0;
bottom: 0;
left:0;
right: 0;
/* #ifndef APP-PLUS */
display: flex;
flex-direction: column;
/* #endif */
}
.cell {
padding-left: 20px;
padding-top: 40px;
padding-right: 20px;
padding-bottom: 40px;
background-color: #F9D7EA;
margin-top: 15px;
}
.loading-more {
align-items: center;
justify-content: center;
padding-top: 14px;
padding-bottom: 14px;
text-align: center;
flex-direction: row;
width:750rpx;
}
.loading-more-text {
font-size: 28upx;
color: #999;
}
.top{
position: fixed;
right:5px;
background-color: #FFFFFF;
bottom:50px;
width:80px;
height: 80px;
border-radius: 50%;
box-shadow: 0 1px 20px 0 rgba(195, 195, 195, 0.5);
align-items: center;
justify-content: center;
}
</style>
注:如果上拉加載數據后,再下拉刷新,然后無法再觸發loadmore事件時,請重置loadmore
loadMore(e) { //loadmore 事件中重置 this.$refs["list"].resetLoadmore();
//下一頁操作
...
}
如果下拉刷新的組件不回彈回去,試試延遲設置hide
