JS使用虛擬列表查看微信聊天記錄功能技巧實(shí)例
PC端 微信聊天記錄查看
這個(gè)功能是pc端程序,實(shí)現(xiàn)手機(jī)端微信聊天記錄查看功能
功能問(wèn)題點(diǎn)
1,默認(rèn)看到的記錄是倒序排列,頁(yè)面最底下一條是最近一條消息
2,聊天記錄可能存在無(wú)限往上翻閱的情況,dom無(wú)法承載如此多消息,需要使用虛擬列表
3, 向上向下翻閱過(guò)程中,滑動(dòng)到上一頁(yè)或者下一頁(yè)如何定位當(dāng)前頁(yè)面最后一條第一條在當(dāng)前,絲滑加載,不出現(xiàn)‘閃跳’情況
4,動(dòng)態(tài)加載,考慮接口性能,一次請(qǐng)求數(shù)據(jù)不能太多,如何維護(hù)整個(gè)消息列表信息
一,消息記錄數(shù)據(jù)結(jié)構(gòu)
需要一個(gè)msgData
字段來(lái)存儲(chǔ)所有從接口返回來(lái)的消息,{data,random}
隨機(jī)數(shù)用于表示數(shù)據(jù)向下傳遞時(shí)表示是更新,初始值是0,每一條消息都有一個(gè)msgId
字段,用于標(biāo)識(shí)當(dāng)前收到的消息記錄中歷史最遠(yuǎn)的一條記錄id。消息上滑下滑根據(jù)滑動(dòng)方向,以及msgId
可以判斷是從內(nèi)存取數(shù)據(jù)還是額外請(qǐng)求接口。
二,數(shù)據(jù)展示
傳入的random
字段用于標(biāo)識(shí)是第一次傳入還是數(shù)據(jù)更新,如果是第一次傳入,新建一個(gè)宏任務(wù),計(jì)算傳入數(shù)據(jù)展示成相應(yīng)元素之后的高度,
const virtualItems = document.getElementById('vir-scroll'); virtualItems.scrollTop = timeFilter ? 0 : virtualItems.scrollHeight; // 如果timefilter 為真,scroll到頂部 currentScroll = timeFilter ? 0 : virtualItems.scrollHeight;
如果是更新,需要計(jì)算目前內(nèi)存中數(shù)據(jù)條數(shù)(數(shù)量小于顯示界面數(shù)據(jù)閾值就追加)以及滾動(dòng)方向,來(lái)獲取相應(yīng)的顯示數(shù)據(jù)。
計(jì)算過(guò)程中,累加元素的getBoundingClientRect().height
來(lái)計(jì)算當(dāng)前展示元素的高度,計(jì)算高度的同時(shí),還需要把對(duì)應(yīng)的dom元素渲染到頁(yè)面中。
滾動(dòng)
const scrollTop = virtualRef.current.scrollTop; direction = scrollTop < currentScroll ? 'down' : 'up'; currentDirection = direction; currentScroll = scrollTop; // 計(jì)算滾動(dòng)條到底部距離,保證異步加載元素位置不變的關(guān)鍵 bottomDistance = virtualRef.current.scrollHeight - virtualRef.current.clientHeight - virtualRef.current.scrollTop; const lastMsgId = direction === 'up' ? +items[items.length - 1]?.key : +items[0]?.key; const indx = wrapperData?.data?.findIndex((elm:any) => elm.msgTime === lastMsgId);
滾動(dòng)時(shí)需要計(jì)算當(dāng)前滾動(dòng)方向,根據(jù)方向再進(jìn)行下面的計(jì)算,這里需要分為上滑和下滑。
下滑到底時(shí),如果距離頂部小于50,就要觸發(fā)計(jì)算,根據(jù)當(dāng)前頁(yè)面元素第一條的索引值去內(nèi)存中找15條,當(dāng)前頁(yè)面元素尾部去掉15條重新拼湊成需要展示到頁(yè)面的完整數(shù)據(jù),然后計(jì)算出scrollHeight
,實(shí)現(xiàn)順滑滑動(dòng)。
上滑到頂,距離底部小于50,觸發(fā)計(jì)算,計(jì)算方式和下滑相反。
以上就是JS使用虛擬列表查看微信聊天記錄功能技巧實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于JS虛擬列表查看微信聊天記錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript如何對(duì)圖片進(jìn)行黑白化
這篇文章主要介紹了JS對(duì)圖片進(jìn)行黑白化的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-04-04一個(gè)鼠標(biāo)移動(dòng)滑出層效果的實(shí)現(xiàn)代碼
一個(gè)鼠標(biāo)移動(dòng)滑出層的代碼,根據(jù)網(wǎng)上的視頻教程學(xué)習(xí)的,這也算是第一次練手吧,鼠標(biāo)靠近復(fù)選框的時(shí)候,就會(huì)顯示出一個(gè)層,移開(kāi)則消失。2011-08-08webpack-bundle-analyzer?插件配置使用方法
webpack-bundle-analyzer?是?webpack?的插件,需要配合?webpack?和?webpack-cli?一起使用,這篇文章主要介紹了webpack-bundle-analyzer?插件配置,需要的朋友可以參考下2023-02-02JavaScript數(shù)組操作之旋轉(zhuǎn)二維數(shù)組
這篇文章主要介紹了JavaScript數(shù)組操作之旋轉(zhuǎn)二維數(shù)組,主要從兩個(gè)方面展開(kāi)文章介紹,一是通過(guò)對(duì)數(shù)組的操作熟練度;二是(鏡像反轉(zhuǎn))比實(shí)現(xiàn)一更優(yōu),減少了空間復(fù)雜度,內(nèi)容介紹具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04基于JavaScript實(shí)現(xiàn)手機(jī)短信按鈕倒計(jì)時(shí)(超簡(jiǎn)單)
在淘寶等購(gòu)物網(wǎng)站,我們都會(huì)看到一個(gè)發(fā)送短信倒計(jì)時(shí)的按鈕,究竟是如何實(shí)現(xiàn)的呢?下面小編通過(guò)本篇文章給大家分享一段代碼關(guān)于js實(shí)現(xiàn)手機(jī)短信按鈕倒計(jì)時(shí),需要的朋友參考下2015-12-12