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

站長資訊網
最全最豐富的資訊網站

聊聊uniapp的scroll-view下拉加載

聊聊uniapp的scroll-view下拉加載

最近在做一個微信小程序直播模塊,模塊里的聊天室功能是用scroll-view + 一維數組的形式展示的,而且也沒有進行任何的優化,導致用戶的體驗感比較差

首先模擬一下優化前的聊天室情況

聊聊uniapp的scroll-view下拉加載

肉眼可見的蛋疼~

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

1. 不再使用scroll-into-view設置錨點

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

2. 大量數據的處理

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

3. 附加功能處理

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

OK開工~

1、倒置scroll-view

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

首先是修改前的代碼?

<view class="live-content">這是一個直播畫面</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來替換一下,結果也是一樣的,但是為了更明顯的回彈效果我使用了定時器   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套上一個transform:rotate(180deg)的屬性,然后再給內部的子元素也套上同樣的屬性,別忘了給存放數據的數組也倒置一下,最重要的,把scroll-view上的scroll-into-view屬性去掉,就會得到這樣的效果?

聊聊uniapp的scroll-view下拉加載

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

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

到這里還只是第一步,下一步是如何下拉加載數據

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

聊聊uniapp的scroll-view下拉加載

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

聊聊uniapp的scroll-view下拉加載

2、大量數據的處理

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

我第一個想法就是非常經典的虛擬列表,但是此前所看的很多關于虛擬列表的文章都是在web端實現的,似乎小程序領域里并不是一個被經常采用的方法,但是所幸還是找到了如何在微信小程序實現虛擬列表的資料,詳情可以查看這篇文章?微信小程序虛擬列表

OK說干就干,那么第一步就是要明確實現虛擬列表需要什么樣的數據結構,虛擬列表其實簡單地說就是當某一個模塊的數據超出了可視范圍就將其隱藏,那么如何將數據分為多個模塊呢?答案就是二維數組

首先將當前的頁碼存儲起來(默認為0),當觸發下拉加載動作時頁碼+1,然后以當前頁碼作為下標存入數組

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; };

當然別忘了在頁面中也需要以二維數組的形式循環數據

<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>
數據結構的問題解決了,那么接下來就是如何判斷數據模塊是否超出可視范圍

首先我們需要知道每個數據模塊的高度,其實很簡單,只需要為每個模塊定義一個id,然后在數據展示之后根據id獲取到該模塊的節點信息然后按順序存儲到數組中即可

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

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

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

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

onReady(() => {   ...   observer(currentShowPage.value); }); const upper = () => {   ...   nextTick(() => {     // 每次獲取新數據都調用一下     observer();   }); };  // 允許渲染的數組下標,需要設置默認值 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];   }); };

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

<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下拉加載

額…似乎沒有太大區別,那我們看看頁面結構到底也沒有將可視區域外的內容切換為空白view

聊聊uniapp的scroll-view下拉加載

成功!

3、功能調整

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

這個部分就比較簡單了,只需要直接使用scroll-viewscroll-top屬性,然后通過在scroll回調中動態記載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)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品亚洲一区二区三区浴池| 老太BBWWBBWW高潮| 久久久久无码精品国产H动漫| 久久99精品久久久久久国产| 乱人伦中文字幕成人网站在线 | 别揉我奶头~嗯~啊~视频在线观| 成在人线AV无码免费看网站直播| 国产成人午夜福利院| 狠狠色婷婷久久一区二区三区| 久久夜色撩人精品国产AV| 欧美性爱一区二区三区| 天堂中文最新版在线中文| 亚洲高清国产拍精品26U| 在公交车上弄到高C了怎么办| FREEFR性中国少妇性HD| 国产成人无码区免费AⅤ片| 精品国精品国产自在久国产应用 | 99久久国产综合精品女| 公和我做好爽添厨房在线观看| 国产做无码视频在线观看浪潮| 久久亚洲精品成人无码| 日韩国产女人久久久| 亚洲AV无码成H人在线观看| 在线天堂中文最新版| 成人做受120视频试看| 好爽…又高潮了毛片喷水| 免费人成网WW555| 熟妇高潮一区二区精品| 亚洲熟妇无码AV另类VR影视| Chinese辽宁人妻4p| 国产裸拍裸体视频在线观看| 久久免费观看午夜成人网站| 日韩高清不卡无码AV| 亚洲国产精品尤物YW在线观看 | 欧美XXXX做受欧美88HD| 无码男男作爱G片在线观看| 伊人激情AV一区二区三区| 成人无号精品一区二区三区| 娇妻被朋友征服中文字幕| 普通话JIZZYOU中国少妇| 亚洲AⅤ成人精品无码| 2021国产手机在线精品| 国产精品乱码一区二区三| 蜜桃国产乱码精品一区二区三区| 停不了的爱在线观看| 中文字幕巨爆区乳爆系列| 国产精品久久久久久久久电影网 | 99国产精品久久久蜜芽| 国产微拍精品一区二区| 欧美日韩亚洲中文字幕一区二区三| 午夜亚洲AⅤ无码高潮片在线观看| 中文无码字幕一区到五区免费| 国产成人午夜高潮毛片| 蜜臀av夜夜嗨一区二区粉嫩 | 制服丝袜长腿无码专区第一页| 国产成人免费无码AV在线播放| 美女黑人做受XXXXXⅩ性| 无码人妻一区二区三区免费手机 | 人妻无码AⅤ中文字幕系列| 亚洲精品无码你懂的网站| 第一次爱的人免费观看电视剧| 久久人人爽人人爽人人片AVY| 天堂А√在线最新版在线| 777琪琪午夜理论电影网| 国语对白做受XXXXX在线中国| 人妻少妇HEYZO无码专区| 亚洲日韩片无码中文字幕| 国产成人亚洲综合无码AⅤ| 欧美黑人又粗又大高潮喷水| 亚洲精品一卡2卡三卡4卡5卡| 丰满日韩放荡少妇无码视频| 男男车车的车车网站W98免费| 亚洲VA中文字幕| 国产成本人片免费AV| 欧美军警GAY巨大粗长| 亚洲熟妇色XXXXX欧美老妇| 国产精品成人免费视频网站| 欧美又粗又大XXXXBBBB疯狂| 亚洲已满18点击进入在线看片| 国产精品视频永久免费播放| 人人妻人人做从爽精品| 中文字幕亚洲综合久久综合| 娇妻初尝粗大滋味借种韩国电影| 四虎影视成人永久免费观看视频| HD女人奶水授乳MILK| 浪潮AV激情高潮国产精品| 亚洲AV永久无码精品九九| 公在客厅里吃我的奶涨奶视频 | AV无码不卡一区二区三区| 久久久久国色AV∨免费看| 亚洲AV无码专区精品无码| 国产成人精品视频网站| 日本XXX色视频| 80S国产成年女人毛片| 久久久无码人妻精品无码| 亚洲S色大片在线观看| 国产精品Ⅴ无码大片在线看| 肉大捧一进一出免费视频| NARUTOMANGA全彩纲手| 妺妺坐在我腿上勃起弄了视频| 野花高清免费观看完整视频中文版 | 在熟睡夫面前侵犯我在线播放| 精品久久综合1区2区3区激情| 无遮挡色视频真人免费不卡| 国产9 9在线 | 中文| 日韩人妻无码中文字幕视频| 阿娇13分钟视频无删减MP4| 欧美成人精品高清视频在线观看 | 亚洲AV永久无码3D动漫在线观| 国产口爆吞精在线视频| 未满十八岁可以去日本留学吗| 大爷你的太大了我| 日本熟妇WWW色视频在线播放| Z0ZOZ0另类Z0ZO| 全部AV―极品视觉盛宴| JAPANESE嫩21VIDE| 欧美精品99久久久啪啪| 92成人午夜福利一区二区| 妺妺窝人体色WWW精品777| 最新精品国偷自产在线下载| 领导不戴套玩弄下属娇妻 | 亚洲AV无码成人专区| 国语自产拍精品香蕉在线播放| 亚洲AV日韩AⅤ无码色老头| 国产在线码观看超清无码视频| 性妇WBBBB搡BBBB嗓1| 国产亚洲大尺度无码无码专线 | 无码国产成人久久| 国产精品久久久久久免费软件 | 中国蓝CHINABLUE| 麻豆久久久9性大片| 中国XXXX真实偷拍| 免费十大软件大全下载安装| 91人妻人人澡人人爽人人| 欧美成人精品在线观看| 扒开粉嫩的小缝隙喷白浆| 日韩人妻无码精品—专区| 丰满少妇被猛烈进入高清APP| 天堂√中文最新版在线| 国产精品综合色区在线观看| 亚洲AV无码国产精品色午| 精品国产黑色丝袜高跟鞋| 亚洲无人区码一码二码三码区别 | 超清少妇爆乳无码av无码专区 | 亚洲日韩精品A∨片无码| 久久人妻蜜桃一区二区三区| 中文字幕人妻高清乱码| 欧美性战A久久久久久| 成人免费无遮挡无码黄漫视频| 他用嘴巴含着我奶头吸怎么办| 国产精品免费久久久久软件 | 午夜毛片不卡高清免费看| 韩国三级L中文字幕无码| 亚洲色帝国综合婷婷久久| 蜜臀色欲AV在线播放国产日韩 | 777米奇色狠狠888俺也去乱| 全免费A级毛片免费看无码| 高清一区二区三区日本久| 亚洲AV高清在线观看一区二区三| 久久国产乱子精品免费女| 67194熟妇在线直接进入百度| 人妻聚色窝窝人体www一区91| 国产成人国拍亚洲精品| 亚洲成成熟女人专区| 毛片TV网站无套内射TV网站| 超碰CAO已满18进入| 亚洲A∨精品无码一区二区| 久久人人做人人妻人人玩精品VA| JAPANESE极品少妇| 无码免费一区二区三区免费播放| 精品人妻系列无码专区| 37大但人文艺术A级都市天气| 揉着我的奶从后面进去| 狠狠色丁香久久婷婷综合蜜芽五月| 影音先锋2020色资源网| 日本三级欧美三级人妇视频黑白配 | 中文字幕人妻无码系列第三区| 撒尿PISSINGⅤIDEEO| 国模少妇无码一区二区三区| 制服 丝袜 人妻 专区一本| 肉欲麻豆天美传媒| 精品久久久久久综合日本| 99久久精品费精品国产一区二区 | 6080YYY午夜理伦三级| 特区爱奴在线观看| 久久午夜夜伦鲁鲁片免费无码影院| 被揉到高潮揉出水视频| 亚洲A成人片在线播放| 欧美成人精品在线| 国产农村乱人伦精品视频| 中文无码一区二区视频在线播放量| 色噜噜噜狠狠色一色伊人蜜桃 | 国产乱妇乱子在线播视频播放网站 | 乱公和我做爽死我视频| 国产成人精欧美精品视频| 英语老师乖乖挽起裙子怎么写作文| 日日猛噜噜狠狠扒开双腿小说| 久久97超碰人人澡人人爱| 厨房人妻HD中文字幕69XX| 亚洲午夜性春猛交ⅩXXX|