国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

客服IM消息列表虛擬滾動技術實踐

開發 前端
在IM會話消息列表體驗優化事項中我們對“上拉加載”、“下拉加載”、“下拉刷新”的技術特點和使用場景做了分析,然后對于下拉加載精確回滾這個場景,提出了三種解決方案:“定時器方案”、“等待圖片/視頻資源onload完成方案”、“反向渲染方案”;這三種方案各有利弊,希望能對讀者帶來一些啟發和幫助。?

1、場景分析

在IM系統中,核心事件都是圍繞著“聊天”這個主題展開的,在聊天的過程中,獲悉用戶的需求,再通過系統集成的各種工具,幫助用戶完成訴求;“聊天”在IM業務中就是“會話消息”,當客服與用戶之間存在大量聊天消息的時候,如何更好的去加載用戶歷史消息,提升客服查看消息體驗,是一個值得研究的方向。

由于聊天室的特殊布局,歷史消息加載需要用到虛擬滾動的方式去實現,如果想要更好的性能,還需要使用虛擬列表技術,而虛擬滾動技術又分為“上拉加載”和“下拉加載”,在移動端領域,還需要“下拉刷新”,如何選擇合適的技術方案是我們接下來需要討論的問題。

2、虛擬滾動技術調研

虛擬滾動技術的使用場景主要是在布局空間較小,不方便添加分頁器的頁面,例如移動端列表頁,IM系統左側進線會話列表,會話消息列表,右側功能區域訂單/商品查詢列表等。

例如:會話進線列表,商品查詢列表可以用到上拉加載,會話消息列表需要用到下拉加載,在移動端,頁面刷新還需要用到下拉刷新。

圖片

下拉加載、上拉加載、下拉刷新方案對比:

技術方案

觸發方式

應用場景

技術特點/難點

下拉加載

滾動到頁面頂部觸發

會話消息列表數據加載

需要解決回滾定位不準的問題,還需要關注頁面圖片/視頻資源的對滾動定位的影響

上拉加載

滾動到頁面底部觸發

訂單/商品列表數據加載,select下拉框,移動端列表頁面

需要計算滾動到頁面底部,加載滾動體驗較好,更符合用戶的視覺感受

下拉刷新

拖動頁面頂部向下移動一定距離觸發

H5頁面刷新

需要處理好下拉橡皮筋效果,成功后刷新頁面

上面對我們系統中需要用到的加載/刷新技術做了簡單的實現和應用場景對比,其中上拉加載,下拉刷新不作為此次討論的重點,且社區中實現的方案和博客也較多,我們此次重點討論的是下拉加載在IM會話消息中的應用和體驗優化。

3、下拉加載在會話消息的應用

3.1   會話消息歷史數據下拉加載流程

歷史數據拉取會經歷三個過程:

  • 用戶滾動消息到頁頂,觸發加載機制,在拉取數據的過程中,頂部展示一個“數據正在加載中”的loading文案,告知用戶需要等待加載結果的完成;
  • 數據返回之后,會被置于原數據的頂部(array.unshift(newArray)),渲染后原來的內容就會被新的內容壓到頁面底部;
  • 為了提高用戶的體驗,還需要將頁面滾動到滾動條最后停留的位置(加載前最后一條消息位置)

圖片

3.2   如何實現下拉加載

  • 監聽頁面scroll事件
// 監聽會話消息區域添加滾動監聽事件
const listenScrollEvent = () => {
chatMsgContainer.value.addEventListener('scroll', scrolHandle)
}


// 滾動邏輯處理回調函數
const scrolHandle = throttle(event => {
const { scrollHeight, scrollTop } = chatMsgContainer.value || {}
const { target } = event || {}
// 記錄下當前會話滾動位置,切換會話的時候需要回滾到最后停留的位置
userInfo.value.scrollPosition = scrollHeight - scrollTop || 0
// 超出一屏,滾動到頂部,且沒有拉取完所有的數據
if (
target.scrollTop === 0 &&
target.scrollHeight > target.clientHeight &&
!userInfo.value?.isComplete
) {
handleScrollEvent(event) // 拉取歷史消息
}
}, 300)
  • 監聽數據變化執行回滾動作
// 消息滾動
const handleMessageScroll = (len: number, oldLen: number) => {
if (!len) return
let msgScrollTimer = null
let targetDom = null
nextTick(() => {
// 獲取到加載后最后一條數據位置
const recentlyMsg = messagePools[len - 1]
// 計算新加載數據條數
const calcMsgLenDiff = len - oldLen
// 首次加載數據的時候讓滾動條滾動到最底部
if (len <= LIMIT_MESSAGE) {
// msgid是會話中的唯一標識,可以用此作為唯一ID
targetDom = document.querySelector(recentlyMsg.msgid)
// true 元素的頂部將對齊到可滾動祖先的可見區域的頂部。對應于scrollIntoViewOptions: {block: "start", inline: "nearest"}
firstDom?.scrollIntoView?.(true)
} else if (calcMsgLenDiff <= 1 && !recentlyMsg?.isHistory) {
// 這里用來處理用戶/客服發送消息滾動邏輯
handleUserOrCustomerMsg()
} else if (calcMsgLenDiff >= 1) {
// 拉取歷史消息邏輯
// 獲取到加載前最后一條數據位置
const prevLastMsg = messagePools[calcMsgLenDiff - 1]
targetDom = document.querySelector(prevLastMsg.msgid)
targetDom?.scrollIntoView?.()
}
userInfo.value.isShowLoading = false
})
}


// 監聽會話消息數據變化
watch(
() => messagePools.length,
(len, oldLen) => {
handleMessageScroll(len, oldLen)
},
{
immediate: true
}
)
  • 下拉加載體驗優化方案及效果

如果只是按照上面的方式去處理,當頁面中存在圖片/視頻的情況下,由于圖片/視頻渲染慢于普通文本,在加載圖片/視頻類型的消息的時候,回滾的位置就會有偏差,不能準確的回滾到預期的位置,我們對以下三種方案進行了對比實現,最終選擇了反向渲染加載的方案,如下:

3.2.1   setTimeout延時回滾方案

  • 優點:簡單易實現,只需要設置一個合適的定時器時間,對于大部分場景都能回滾正確;
  • 缺點:可靠性較低,資源加載慢的情況下,也會出現回滾不準確的情況,且setTimeout會帶來頁面閃爍的問題;

// 消息滾動
const handleMessageScroll = (len: number, oldLen: number) => {
if (!len) return
let msgScrollTimer = null
let targetDom = null
nextTick(() => {
// 獲取到加載后最后一條數據位置
const recentlyMsg = messagePools[len - 1]
// 計算新加載數據條數
const calcMsgLenDiff = len - oldLen
// 首次加載數據的時候讓滾動條滾動到最底部
if (len <= LIMIT_MESSAGE) {
...
// 針對圖片/視頻渲染慢的場景做個補償
msgScrollTimer = setTimeout(() => {
clearTimeout(msgScrollTimer)
firstDom?.scrollIntoView?.(true)
}, SCROLL_THRESHOLD)
} else if (calcMsgLenDiff <= 1 && !recentlyMsg?.isHistory) {
// 這里用來處理用戶/客服發送消息滾動邏輯
handleUserOrCustomerMsg()
} else if (calcMsgLenDiff >= 1) {
// 拉取歷史消息邏輯
// ...
// 針對圖片/視頻渲染慢的場景做個補償
msgScrollTimer = setTimeout(() => {
clearTimeout(msgScrollTimer)
targetDom?.scrollIntoView?.()
}, SCROLL_THRESHOLD)
}
userInfo.value.isShowLoading = false
})
}

3.2.2   監聽img/vedio的onload事件方案

  • 優點:可以回滾的精準度較高,沒有頁面閃爍的問題;
  • 缺點:如果不是虛擬列表,每次滾動的時候可能會有大量的DOM節點查詢操作,造成頁面滾動卡頓;
const allImgOrVedioLoaded = async() => {
const imgNodes = document.querySelectorAll('.messageWrapper img') || []
const vedioNodes = document.querySelectorAll('.messageWrapper vedio') || []
const promises = [...imgNodes, ...vedioNodes]
// 等待所有的資源加載完成,無論成功還是失敗
return await Promise.allSettled(
promises.map(source => {
new Promise(resolve => {
source.addEventListener('load', () => resolve(source))
})
})
)
}
// 消息滾動
const handleMessageScroll = (len: number, oldLen: number) => {
if (!len) return
let msgScrollTimer = null
let targetDom = null
nextTick(() => {
...
// 等待img/vedio所有資源加載完成,執行回滾操作
allImgOrVedioLoaded().then(() => {
firstDom.scrollIntoView(true)
})
} else if (calcMsgLenDiff <= 1 && !recentlyMsg?.isHistory) {
// 這里用來處理用戶/客服發送消息滾動邏輯
handleUserOrCustomerMsg()
} else if (calcMsgLenDiff >= 1) {
// 拉取歷史消息邏輯
// ...
// 等待img/vedio所有資源加載完成,執行回滾操作
allImgOrVedioLoaded().then(() => {
targetDom.scrollIntoView()
})
}
userInfo.value.isShowLoading = false
})
}

定時器/onload方案下拉加載回滾流程圖:

圖片

3.2.3   反向渲染加載方案

前面我們有提到過“上拉加載”,當滾動到底部加載新的一頁的數據,數據從底部添加,無需執行回滾動作,整體的體驗更加流暢自然。

既然“上拉加載”有這么多好處,那我們可不可以使用這樣的方式來模仿我們的“下拉加載”呢?顯然是可以的,我們頁面布局在使用flex布局的情況下,可以反轉主軸,這樣我們就可以像“上拉加載”一樣,觸發到頁面底部的時候,就去拉取新的歷史數據,且反向渲染只是數據的反轉,并不會帶來視覺上的反轉;

display: flex;
flex-direction: column-reverse;

圖片

圖片

3.3   帶來的效果

圖片

4、總結

在IM應用中,會話消息列表扮演著很重要的角色,是用戶與客服溝通結果最終呈現的地方,所以想要提升頁面的加載性能和用戶體驗,下拉加載性能和體驗一直是一個重要的指標,當然對于大列表組件最好結合使用虛擬列表技術,盡量少的DOM渲染和盡量精準的滾動效果才能給客服帶來最極致的體驗。

最后做個總結:在IM會話消息列表體驗優化事項中我們對“上拉加載”、“下拉加載”、“下拉刷新”的技術特點和使用場景做了分析,然后對于下拉加載精確回滾這個場景,提出了三種解決方案:“定時器方案”、“等待圖片/視頻資源onload完成方案”、“反向渲染方案”;這三種方案各有利弊,希望能對讀者帶來一些啟發和幫助。


責任編輯:武曉燕 來源: 得物技術
相關推薦

2023-02-01 18:33:44

得物商家客服

2024-08-22 14:21:26

2023-10-16 18:39:22

2023-12-07 19:48:42

2015-06-10 15:36:47

環信移動客服

2022-12-02 18:45:06

SOP機器人技術

2024-12-03 11:59:53

2024-02-01 08:00:00

百川大模型角色大模型

2012-02-09 15:39:38

思科虛擬化技術醫療行業

2021-09-18 09:53:48

京東客服IM消息消息處理

2024-10-14 08:09:08

2017-11-23 09:23:05

消息推送系統存儲

2024-08-22 18:49:23

2024-04-25 14:27:32

順序消息事務消息

2023-07-04 15:56:08

DevOps開發測試

2021-12-10 10:29:07

在線客服系統

2024-09-18 08:25:46

2023-12-30 13:47:48

Redis消息隊列機制

2023-12-22 10:04:34

攜程負載均衡引擎

2014-06-24 09:47:33

虛擬運營商170
點贊
收藏

51CTO技術棧公眾號

最近的2019中文字幕免费一页| 中文字幕亚洲欧美| 日本福利片免费看| 久久久久久综合| 免费激情视频在线观看| 日本一区二区成人在线| av一级在线| 大桥未久av一区二区三区| 日韩porn| 日韩精品在线看片z| 日韩av电影资源网| 69久久夜色精品国产69| 四虎成人av| 亚洲精品日韩成人| 久久精品综合网| 性视频一区二区三区| 91精品国产综合久久精品app| 国产精品一二三产区| 中文字幕国产精品| 国产精品美女久久久久久不卡| www.日本一区| 成人免费看黄网址| 欧美777四色影视在线| 精品高清美女精品国产区| 91蜜桃在线视频| 欧美一区=区三区| 欧美视频国产精品| 国产精品国产一区| 大荫蒂性生交片| 久久久综合免费视频| 麻豆成人久久精品二区三区小说| 亚洲v日韩v欧美v综合| 精品日韩美女的视频高清| www.日本一区| 欧美一区二区不卡视频| 777电影在线观看| 亚洲影院高清在线| 日本福利一区二区| 久久尤物电影视频在线观看| 国产区在线看| 丁香五月网久久综合| 国产精品乱码一区二三区小蝌蚪| 久久精品国产第一区二区三区| 日本不卡网站| www日韩在线观看| 成人两性免费视频| 97久久超碰精品国产| 欧美精品无码一区二区三区| 3d动漫精品啪啪一区二区竹菊| 第一会所sis001亚洲| 成人免费看片网址| 日韩欧美亚洲综合| 欧美一级视频| 97在线精品| 好了av在线| 亚洲午夜精品久久久久久久久| 久久久人成影片免费观看| 欧美特黄一级大片| 国产高清视频网站| 欧美富婆性猛交| 日韩午夜在线观看视频| 国产一区不卡在线| 91视频亚洲| 一二三四社区在线视频| 亚洲一区二区三区久久| 玉米视频成人免费看| 模特精品在线| 国产极品嫩模在线观看91精品| 国产综合 伊人色| 欧美一级一区二区| 久久99久久久久| 丝袜诱惑亚洲看片| 大型av综合网站| 最新中文在线视频| 人妻少妇被粗大爽9797pw| 欧美tickling挠脚心丨vk| 中文在线免费一区三区高中清不卡| 婷婷综合一区| 国产va在线视频| 一区二区三区动漫| 亚洲最新色图| 亚洲成人av免费看| 伊人久久综合97精品| 久久精品人人| 91这里只有精品| 5566av亚洲| 亚洲国产精品一区二区久久恐怖片| av在线精品| 天堂…中文在线最新版在线| 日韩精品中文字| 久久激情五月激情| 久久www人成免费看片中文| 国产一区二区不卡视频| 色av综合在线| 国产在线欧美| 色多多视频在线观看| www久久99| 精品视频一区三区九区| 伊人激情综合| 伊人免费在线| 欧美日韩喷水| 亚洲国产一区自拍| 韩国av一区二区三区在线观看| 国产亚av手机在线观看| 日韩精品欧美一区二区三区| 欧美精品精品一区| 日韩精品1区2区3区| 欧美13videosex性极品| 久久人妻无码一区二区| 国产亚洲精品激情久久| 91香蕉视频在线| 久久这里只有精品一区二区| 国产在线视频你懂| 亚洲a∨日韩av高清在线观看| 91精品福利视频| 免播放器亚洲| 亚洲第一二三四区| 亚洲精品蜜桃久久久久久| 伊人成人开心激情综合网| jlzzjlzz亚洲日本少妇| 美日韩黄色大片| 视频在线观看你懂的| 国产精品久久亚洲| 日韩av在线免播放器| 久久综合九色综合97婷婷女人 | xxxx69视频| 成人免费福利在线| 欧美日韩高清一区二区| 蜜臀av一区二区在线免费观看| 日韩不卡视频在线观看| 播九公社成人综合网站| 国产精品一区二区久久| 欧美精品黑人性xxxx| 国产福利精品一区二区| 麻豆国产一区| 三级无遮挡在线观看| 亚洲欧美日韩精品在线| 欧美成人高清视频| 黄色精品一区二区| 日本麻豆一区二区三区视频| 欧美亚洲人成在线| 97在线资源| 亚洲精品国产精品国自产| 欧美理论片在线观看| 一区二区欧美国产| 丝袜亚洲另类欧美| 91午夜精品| 色网站在线看| 无码人妻h动漫| 成人免费视频网| 亚洲男人天堂网| 成人欧美一区二区三区小说| 国产欧美日韩一级| 自拍偷拍亚洲图片| 亚洲国产精华液| 9191国产视频| 国产v综合v亚洲欧美久久| 亚洲风情亚aⅴ在线发布| 国产精品乱人伦中文| 日韩国产高清在线| 国产成人调教视频在线观看| 成人性生交大片免费看网站| 91人成在线| 菠萝蜜视频在线观看入口| 国产精品在线看| 中文字幕在线日韩| 色噜噜狠狠成人中文综合 | 欧美日本久久| 蜜桃精品视频| 成人免费看片| 992tv成人国产福利在线| 国产无限制自拍| 激情欧美一区二区三区中文字幕| 久久高清视频免费| 91精品国产综合久久香蕉的特点 | 国产69精品久久久久99| 91精品国产综合久久国产大片| 国产精品久久毛片| 国产精品资源在线看| 国产精品xvideos88| 一区二区三区四区高清视频| 亚洲精品天堂| 三级网站在线| 免费裸体美女网站| 一区精品在线| 国产一区二区在线观看免费播放| 国语自产精品视频在线看一大j8| 亚洲精品av在线| 欧美色窝79yyyycom| 一区二区三区日韩在线观看| av一区二区三区在线| 美女高潮久久久| 在线一区视频| 欧美涩涩网站| 欧美独立站高清久久| 日韩激情毛片| 精品一级视频| 四虎影视精品永久在线观看| 瑟瑟视频在线看| 91www在线|