成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

聊聊uniapp的scroll-view下拉加載

聊聊uniapp的scroll-view下拉加載

最近在做一個(gè)微信小程序直播模塊,模塊里的聊天室功能是用scroll-view + 一維數(shù)組的形式展示的,而且也沒有進(jìn)行任何的優(yōu)化,導(dǎo)致用戶的體驗(yàn)感比較差

首先模擬一下優(yōu)化前的聊天室情況

聊聊uniapp的scroll-view下拉加載

肉眼可見的蛋疼~

但是優(yōu)化還是得優(yōu)化滴,不優(yōu)化是不可能滴,但是在開始之前,我覺得有必要把優(yōu)化步驟拆分為以下兩點(diǎn)?

1. 不再使用scroll-into-view設(shè)置錨點(diǎn)

由于舊版本使用的是scroll-view + 一維數(shù)組的形式實(shí)現(xiàn)的,這就導(dǎo)致在數(shù)據(jù)添加后頁面總會(huì)顯示加載后的最后一條信息,而不是加載前的最后一條信息,因此上一任開發(fā)者使用了scroll-into-view屬性作為數(shù)據(jù)加載后的回位錨點(diǎn),但是由于錨點(diǎn)指向的切換和數(shù)據(jù)加載并不是同步發(fā)生的,這就導(dǎo)致出現(xiàn)回彈的現(xiàn)象

2. 大量數(shù)據(jù)的處理

因?yàn)槭?code>聊天室功能,因此不可避免的需要加載大量的用戶對話、圖片等內(nèi)容,又因?yàn)?code>scroll-view本身并不適合加載大量的數(shù)據(jù)(太菜了想不出來其他辦法),故而需要在數(shù)據(jù)的加載和顯示部分下點(diǎn)功夫處理一下

3. 附加功能處理

聊天室原本還有返回底部等功能存在,因此在完成優(yōu)化后原本的功能也不能忽略

OK開工~

1、倒置scroll-view

為什么要倒置scroll-view呢?從上面的第一點(diǎn)我們可以看出,如果需要正序地插入數(shù)據(jù),那么就會(huì)不可避免地出現(xiàn)數(shù)據(jù)加載后無法顯示后面數(shù)據(jù)的情況,但是想要解決這種情況又需要使用scroll-into-view屬性,那么如果需要徹底地解決這個(gè)問題,就需要從問題的根源scroll-view下手

首先是修改前的代碼?

<view class="live-content">這是一個(gè)直播畫面</view>   <scroll-view     class="scroll"     :scroll-y="true"     :scroll-into-view="scrollIntoView"     @scrolltoupper="upper"   >     <view       :id="item.index"       :style="{         backgroundColor: item.color,         height: '200rpx',         lineHeight: '200rpx',         textAlign: 'center',       }"       v-for="item in scrollData"       :key="item.index"     >       {{ item.data }}     </view>   </scroll-view>
const scrollIntoView = ref("index1"); const upper = () => {   let lastNum = scrollData.value[0].data;   let newArr = [];   for (let index = 1; index <= 10; index++) {     newArr.push({       color: getRandomColor(),       data: lastNum + index,       index: `index${lastNum + index}`,     });   }   scrollData.value.unshift(...newArr.reverse());   // 這里可以使用nextTick來替換一下,結(jié)果也是一樣的,但是為了更明顯的回彈效果我使用了定時(shí)器   setTimeout(() => {     scrollIntoView.value = `index${lastNum}`;     console.log("scrollIntoView  :>>", scrollIntoView.value);   }, 100); }; const getRandomColor = () => {   return "#" + Math.random().toString(16).substr(2, 6); };

那么就先來試一下倒置scroll-view到底也沒有效果

首先我們需要給scroll-view套上一個(gè)transform:rotate(180deg)的屬性,然后再給內(nèi)部的子元素也套上同樣的屬性,別忘了給存放數(shù)據(jù)的數(shù)組也倒置一下,最重要的,把scroll-view上的scroll-into-view屬性去掉,就會(huì)得到這樣的效果?

聊聊uniapp的scroll-view下拉加載

還有就是此時(shí)滾動(dòng)條的位置是在左邊的,如果有需要可以使用CSS屬性去掉,或者自行模擬,下面是去去除滾動(dòng)條的CSS樣式?

::-webkit-scrollbar {   display:none;   width:0;   height:0;   color:transparent; }

到這里還只是第一步,下一步是如何下拉加載數(shù)據(jù)

此時(shí)我們的scroll-view是處于倒置的狀態(tài),也就是說頂部是底,底部才是頂(擱著繞口令呢),所以之前使用的scrolltoupper觸頂方法要替換成scrolltolower觸底方法才能實(shí)現(xiàn)“下拉加載”

聊聊uniapp的scroll-view下拉加載

下面是目前的聊天室看起來好多了

聊聊uniapp的scroll-view下拉加載

2、大量數(shù)據(jù)的處理

處理完回彈問題后,就需要考慮如何處理大量數(shù)據(jù)。由于uni-app官方也在文檔中提到scroll-view加載大批量數(shù)據(jù)的時(shí)候性能較差,但無奈手頭上也沒有別的辦法,只能死馬當(dāng)活馬醫(yī)了

我第一個(gè)想法就是非常經(jīng)典的虛擬列表,但是此前所看的很多關(guān)于虛擬列表的文章都是在web端實(shí)現(xiàn)的,似乎小程序領(lǐng)域里并不是一個(gè)被經(jīng)常采用的方法,但是所幸還是找到了如何在微信小程序?qū)崿F(xiàn)虛擬列表的資料,詳情可以查看這篇文章?微信小程序虛擬列表

OK說干就干,那么第一步就是要明確實(shí)現(xiàn)虛擬列表需要什么樣的數(shù)據(jù)結(jié)構(gòu),虛擬列表其實(shí)簡單地說就是當(dāng)某一個(gè)模塊的數(shù)據(jù)超出了可視范圍就將其隱藏,那么如何將數(shù)據(jù)分為多個(gè)模塊呢?答案就是二維數(shù)組

首先將當(dāng)前的頁碼存儲(chǔ)起來(默認(rèn)為0),當(dāng)觸發(fā)下拉加載動(dòng)作時(shí)頁碼+1,然后以當(dāng)前頁碼作為下標(biāo)存入數(shù)組

const currentShowPage=ref(0) const upper = () => {   let len = scrollData.value[currentShowPage.value].length - 1;   let lastNum = scrollData.value[currentShowPage.value][len].data;   let newArr = [];   currentShowPage.value += 1;   for (let index = 1; index <= 10; index++) {     newArr.push({       color: getRandomColor(),       data: lastNum + index,       index: `index${lastNum + index}`,     });   }   scrollData.value[currentShowPage.value] = newArr; };

當(dāng)然別忘了在頁面中也需要以二維數(shù)組的形式循環(huán)數(shù)據(jù)

<scroll-view style="transform:rotate(180deg)" :scroll-y="true" @scrolltolower="upper">     <view v-for="(data, index) in scrollData" :key="index">       <view          style="transform:rotate(180deg)"          :style="{           backgroundColor: item.color,           height: '200rpx',           lineHeight: '200rpx',           textAlign: 'center',         }"         v-for="item in data"         :key="item.index"       >         {{ item.data }}       </view>     </view>   </scroll-view>
數(shù)據(jù)結(jié)構(gòu)的問題解決了,那么接下來就是如何判斷數(shù)據(jù)模塊是否超出可視范圍

首先我們需要知道每個(gè)數(shù)據(jù)模塊的高度,其實(shí)很簡單,只需要為每個(gè)模塊定義一個(gè)id,然后在數(shù)據(jù)展示之后根據(jù)id獲取到該模塊的節(jié)點(diǎn)信息然后按順序存儲(chǔ)到數(shù)組中即可

const pagesHeight = [] onReady(()=>{     setPageHeight() })  const upper = () => {   ...   nextTick(() => {     // 每次獲取新數(shù)據(jù)都調(diào)用一下     setPageHeight();   }); };  const setPageHeight = () => {   let query = uni.createSelectorQuery();   query     .select(`#item-${currentShowPage.value}`)     .boundingClientRect(res => {       pagesHeight[currentShowPage.value] = res && res.height;     })     .exec(); };

OK,現(xiàn)在我們已經(jīng)知道每個(gè)模塊的高度了,然后就是監(jiān)聽模塊與可視窗口的交叉范圍。這里有兩種方法,一種是JS獲取可視窗口的高度與模塊scrollTop進(jìn)行差值計(jì)算,另一種是使用小程序的createIntersectionObserver方法讓程序自行監(jiān)聽交叉區(qū)域

這里我展示的是第二種方法,如果對第一種方法感興趣的朋友可以向上看第二章開頭我推薦的《微信小程序虛擬列表》文章

關(guān)于createIntersectionObserver方法的使用其實(shí)很簡單,我們只需要把可視窗口的id以及需要監(jiān)聽的模塊id傳入即可,詳情看官方文檔

onReady(() => {   ...   observer(currentShowPage.value); }); const upper = () => {   ...   nextTick(() => {     // 每次獲取新數(shù)據(jù)都調(diào)用一下     observer();   }); };  // 允許渲染的數(shù)組下標(biāo),需要設(shè)置默認(rèn)值 const visiblePagesList = ref([-1,0,1]) const observer = pageNum => {   const observeView = wx     .createIntersectionObserver()     .relativeTo("#scroll", { top: 0, bottom: 0 });   observeView.observe(`#item-${pageNum}`, res => {     if (res.intersectionRatio > 0) visiblePagesList.value = [pageNum - 1, pageNum, pageNum + 1];   }); };

最后就是在頁面中判斷該模塊是否允許被渲染(也就是是否存儲(chǔ)在visiblePagesList數(shù)組中),這里就很簡單了,只需要寫一個(gè)方法在頁面中調(diào)用即可

<scroll-view id="scroll" class="scroll" :scroll-y="true" @scrolltolower="upper">     <view v-for="(data, index) in scrollData" :key="index" :id="'item-' + index">       <template v-if="includePage(index)">         <view           class="scroll-item"           :style="{             ...           }"           v-for="item in data"           :key="item.index"         >           {{ item.data }}         </view>       </template>       <view v-else :style="{ height: pagesHeight[index] }"></view>     </view>   </scroll-view>
const includePage = index => {   return visiblePagesList.value.indexOf(index) > -1; };

來看看效果如何

聊聊uniapp的scroll-view下拉加載

額…似乎沒有太大區(qū)別,那我們看看頁面結(jié)構(gòu)到底也沒有將可視區(qū)域外的內(nèi)容切換為空白view

聊聊uniapp的scroll-view下拉加載

成功!

3、功能調(diào)整

聊天室原本還有回底功能等,也不能忘了加上

這個(gè)部分就比較簡單了,只需要直接使用scroll-viewscroll-top屬性,然后通過在scroll回調(diào)中動(dòng)態(tài)記載scroll-top的值即可

下面是部分代碼

<scroll-view     id="scroll"     class="scroll"     :scroll-y="true"     :scroll-top="currentTop"     @scroll="handle_scroll"     @scrolltolower="upper"   >   ...   </scroll-view>   <view v-show="showGoBottom" class="go-back-btn" @click="handle_goBottom">回底</view>
let scrollTop; const currentTop = ref(0); const showGoBottom = ref(false); const handle_scroll = throttle(event => {   scrollTop = event[0].detail.scrollTop;   if (scrollTop > 300) {     showGoBottom.value = true;   } }, 100); const handle_goBottom = () => {   currentTop.value = scrollTop;   nextTick(() => {     currentTop.value = 0;   });   showGoBottom.value = false; };

大功告成~

最后附上demo倉庫

https://gitee.com/huang-qihao123/virtual-list-demo

推薦:《uniapp教程》

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
国产精品亚洲А∨天堂免下载| 国产女人喷潮视频免费| 国产成人AV一区二区三区在线| 国产精品扒开腿做爽爽爽视频| 国产无遮挡又黄又爽动态图 | 天堂AV无码大芭蕉伊人AV| 无忧传媒剧国产剧情MV| 亚洲国产人成自久久国产| 伊人久久亚洲综合| WWW.色五月.COM| 国产99久9在线视频传媒| 韩国电影办公室的在线观看| 久久综合色天天久久综合图片 | FREEHDXXXX学生妹| 国产V综合V亚洲欧| 激情综合色综合久久综合| 免费A级毛片波多野结衣| 人妻夜夜爽天天爽三区丁香花| 施主就让贫僧C进去吧| 亚洲爱婷婷色婷婷五月| 中国GAY片男同志免费网站| 波多野结衣中文字幕免费视频| 国产高潮抽搐翻白眼在线播放| 精品无人区一区二区三区 | AJ四色鸳鸯真假区别| 国产AV无码专区亚洲AV毛网站| 极品妇女扒开粉嫩小泬| 欧美成人精品三级网站视频| 天美传媒蜜桃传媒精东| 亚洲一区二区三区无码国产| А√天堂资源官网在线资源| 国产日产欧产精品精品首页| 老师含紧一点H边做边走视频动漫| 日本丰满熟妇BBxBB| 亚洲爆乳AⅤ无码一区二区| ASSFREE疯狂老妇熟女| 国产日产欧产精品精品| 男男GV白嫩小受GV在线播放| 玩弄人妻少妇精品视频| 曰韩精品无码一区二区三区视频| 成熟交BGMBGMBGM图片| 精品久久久久久无码专区| 人妻丰满熟妇AV无码区乱 | 好男人无码内射AV| 欧美另类VIDEOSBESTS| 亚洲 欧美精品SUV| AⅤ中文字幕不卡在线无码| 国产美女精品AⅤ在线| 男人GAY自慰吞精网站| 校花娇喘呻吟校长陈若雪视频| 中美日韩精品激情无码AV| 国产成人AV综合色| 蜜桃AV少妇久久久久久高潮不断| 天天躁日日躁狠狠躁欧美老妇小说| 亚洲综合网国产精品一区| 干了老婆闺蜜两个小时| 乱人伦中文视频在线| 无码专区—VA亚洲V天堂| 51被公侵犯玩弄漂亮人妻| 国产曰的好深好爽免费视频| 琪琪秋霞午夜AV影院| 亚洲欧洲老熟女AV| 国产成人无码AV| 欧美成人精品三级又大又粗| 亚洲国产精品久久艾草| 粗大猛烈进出高潮喷浆H| 老女人性饥渴XXXXⅩHD另| 午夜爽爽爽男女免费观看影院| H无码精品动漫在线观看| 精品国产一区二区三区久久久狼| 日韩人妻无码一区二区三区综合 | 男女体裸下00动态视频| 香蕉久久人人爽人人爽人人片AV| WRITEAS前后双插头| 久久久久亚洲AV成人网人人网站| 无码无套少妇毛多69XXX| XOXOXO性ⅩYY欧美片| 久久久久亚洲AV无码网站| 午夜自慰喷水女成人AV| 草莓丝瓜向日葵黄瓜榴莲IOS| 久久天天躁狠狠躁夜夜AV| 性色AⅤ一二三天美传媒| 成人无码区免费A∨直播| 蜜臀AV网站在线观看| 亚洲精品无码MV在线观看网站| 国产成人一区二区三区影院| 人妻妺妺窝人体色777777| 永久免费不卡在线观看黄网站 | 亚洲成AV人片天堂网久久| 国产AV无码专区亚洲AV漫画| 人妻AV一区二区三区AV免费| 中日AV高清字幕版在线观看 | 在厨房被C到高潮A毛片奶水| 机长脔到她哭H粗话H动漫| 无码人妻 在线视频| 成长人短视频B站| 漂亮人妻被黑人久久精品| 0D0D肥胖老太婆| 久久AV高清无码| 亚洲AV午夜成人片精品| 国产二级一片内射视频播放| 日韩人妻无码系列专区| Z0OZO0人善之交另类| 女人被狂躁c到高潮视频| 一级特黄无码毛片av一区二区 | 国产韩国精品一区二区三区| 人人爽人人澡人人人妻| 99久久婷婷国产一区二区 | 精品水蜜桃久久久久久久| 亚洲AV日韩AⅤ无码网站| 国产精品成人一区二区三区 | 一二三四视频社区| 精品无码中文视频在线观看| 亚洲国产成人久久综合一区77| 国产区在线观看成人精品| 偷窥熟女大屁股对白视频| 饭桌上故意张开腿让公在线观看| 日本适合十八岁以上的护肤品一| 啊~用力CAO我CAO死我视频| 亲子伦AV一区的三区| 99精品久久99久久久久| 欧美成人精品一区二区三区| 18禁强伦姧人妻又大又粗| 男生白内裤自慰GV白袜男同| 18亚洲AV无码成人国产| 每天都在挨CAO中醒来H| 中字年轻漂亮的儿媳2| 老师办公室狂肉校花H| 中文字幕精品亚洲人成在线| 免费无遮挡又黄又爽网站| 18级成人毛片免费观看| 女人下边水润紧致好处| HUGEBOOBS熟妇大波霸| 人人爽天天碰狠狠添| 成人免费无码AV| 特级做A爰片毛片免费看无码| 国产福利一区二区精品秒拍| 西西人体444WWW大胆无码视频| 国产尤物亚洲精品不卡| 亚洲成a人片在线观看无码专区| 精品国产欧美一区二区| 亚洲人成网站观看在线播放| 久久婷婷人人澡人爽人人喊| 中文字幕久久久久久精品| 欧美猛少妇色XXXXX猛叫| 成人国产精品一区二区网站公司 | 装睡被陌生人摸出水好爽| 女儿的朋友7中汉字晋通话| 锕锕锕锕锕锕好多水APP网站| 日日噜狠狠噜天天噜AV| 国产精品特级毛片一区二区三区 | 精品国产一区二区三区AV性色| 一本大道无码人妻精品专区| 男人的天堂免费A级毛片无码| WW欧日韩视频高清在线| 色翁荡息又大又硬又粗又爽| 国产日产欧产精品精品首页| 亚洲人成无码网WWW电影麻豆| 麻花传媒MV在线播放高清MBA| FREE性欧美精品VIDEOS| 试看AAAA啪啪片120秒| 国产综合18久久久久久| 伊人天堂Av无码Av日韩Av| 欧美人与牲动交XXXⅩ| 第一章少妇初尝云雨| 性色AV极品无码专区亚洲AV| 久久久久久精品免费免费69| ASS年轻少妇PIC精品| 天干天干啦夜天天喷水| 精品VPSWINDOWS妇女| 9420高清完整版在线观看| 色综合天天视频在线观看| 含羞草实验室隐藏路径2023| 中文字幕少妇人妻av护士人妻| 日韩人妻中文字幕2021视频| 国产熟女一区二区三区四区五区| 伊人久久大香线蕉AV五月天宝贝 | 拔萝卜全程不该盖被子怎么办 | 天天影视色香欲综合久久| 精品国产自产自在线观看蜜桃| 777米奇色狠狠888俺也去乱| 色悠久久久久综合网伊| 精品露脸国产偷人在视频| A级毛片成人网站免费看| 午夜无码人妻AV大片色欲| 乱码中字在线观看一二区| 初小VIDEOS第一次摘花| 亚洲国产精品久久久久久| 欧美激情000ⅩXX同性| 国产精品99久久久久久人| 伊人丁香狠狠色综合久久| 日韩人妻OL丝袜AV一二区| 极品尤物被啪到呻吟喷水| JIZZ成熟丰满韩国女人少妇| 先锋影音人妻啪啪VA资源网站| 乱人伦中文无码视频| 国产V亚洲V天堂无码网站| 瑜伽裤国产一区二区三区| 玩弄漂亮少妇高潮大叫| 免费无码一区二区三区蜜桃大|