Skip to content

Commit 79b6b87

Browse files
author
puhui999
committed
【修复】mall 客服会话消息页面高度不一致导致的滚动功能精度失效
1 parent b6cd12a commit 79b6b87

File tree

2 files changed

+29
-13
lines changed

2 files changed

+29
-13
lines changed

src/views/mall/promotion/kefu/components/KeFuMessageList.vue

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
</el-header>
66
<el-main class="kefu-content overflow-visible">
77
<el-scrollbar ref="scrollbarRef" always height="calc(100vh - 495px)" @scroll="handleScroll">
8-
<div ref="innerRef" class="w-[100%] pb-3px">
8+
<div v-if="refreshContent" ref="innerRef" class="w-[100%] pb-3px">
99
<!-- 消息列表 -->
1010
<div v-for="(item, index) in getMessageList0" :key="item.id" class="w-[100%]">
1111
<div class="flex justify-center items-center mb-20px">
@@ -121,17 +121,25 @@ const conversation = ref<KeFuConversationRespVO>({} as KeFuConversationRespVO) /
121121
const showNewMessageTip = ref(false) // 显示有新消息提示
122122
const queryParams = reactive({
123123
pageNo: 1,
124+
pageSize: 10,
124125
conversationId: 0
125126
})
126127
const total = ref(0) // 消息总条数
127-
128+
const refreshContent = ref(false) // 内容刷新,主要解决会话消息页面高度不一致导致的滚动功能精度失效
128129
/** 获得消息列表 */
129-
const getMessageList = async (val: KeFuConversationRespVO) => {
130+
const getMessageList = async (val: KeFuConversationRespVO, conversationChange: boolean) => {
131+
// 会话切换,重置相关参数
132+
if (conversationChange) {
133+
queryParams.pageNo = 1
134+
messageList.value = []
135+
total.value = 0
136+
loadHistory.value = false
137+
refreshContent.value = false
138+
}
130139
conversation.value = val
131140
queryParams.conversationId = val.id
132141
// 情况一:已经加载完所有消息
133-
const messageTotal = messageList.value.length
134-
if (total.value > 0 && messageTotal > 0 && messageTotal === total.value) {
142+
if (skipGetMessageList.value) {
135143
return
136144
}
137145
const res = await KeFuMessageApi.getKeFuMessagePage(queryParams)
@@ -148,6 +156,7 @@ const getMessageList = async (val: KeFuConversationRespVO) => {
148156
messageList.value.push(item)
149157
}
150158
}
159+
refreshContent.value = true
151160
await scrollToBottom()
152161
}
153162
@@ -164,7 +173,7 @@ const refreshMessageList = async () => {
164173
}
165174
166175
queryParams.pageNo = 1
167-
await getMessageList(conversation.value)
176+
await getMessageList(conversation.value, false)
168177
if (loadHistory.value) {
169178
// 右下角显示有新消息提示
170179
showNewMessageTip.value = true
@@ -173,6 +182,10 @@ const refreshMessageList = async () => {
173182
174183
defineExpose({ getMessageList, refreshMessageList })
175184
const showKeFuMessageList = computed(() => !isEmpty(conversation.value)) // 是否显示聊天区域
185+
const skipGetMessageList = computed(() => {
186+
// 已加载到最后一页的话则不触发新的消息获取
187+
return total.value > 0 && Math.ceil(total.value / queryParams.pageSize) === queryParams.pageNo
188+
}) // 跳过消息获取
176189
177190
/** 处理表情选择 */
178191
const handleEmojiSelect = (item: Emoji) => {
@@ -212,7 +225,7 @@ const sendMessage = async (msg: any) => {
212225
await KeFuMessageApi.sendKeFuMessage(msg)
213226
message.value = ''
214227
// 加载消息列表
215-
await getMessageList(conversation.value)
228+
await getMessageList(conversation.value, false)
216229
// 滚动到最新消息处
217230
await scrollToBottom()
218231
}
@@ -242,8 +255,7 @@ const handleToNewMessage = async () => {
242255
/** 加载历史消息 */
243256
const loadHistory = ref(false) // 加载历史消息
244257
const handleScroll = async ({ scrollTop }) => {
245-
const messageTotal = messageList.value.length
246-
if (total.value > 0 && messageTotal > 0 && messageTotal === total.value) {
258+
if (skipGetMessageList.value) {
247259
return
248260
}
249261
// 触顶自动加载下一页数据
@@ -253,11 +265,14 @@ const handleScroll = async ({ scrollTop }) => {
253265
}
254266
const handleOldMessage = async () => {
255267
// 记录已有页面高度
256-
const oldPageHeight = innerRef.value!.clientHeight
268+
const oldPageHeight = innerRef.value?.clientHeight
269+
if (!oldPageHeight) {
270+
return
271+
}
257272
loadHistory.value = true
258273
// 加载消息列表
259274
queryParams.pageNo += 1
260-
await getMessageList(conversation.value)
275+
await getMessageList(conversation.value, false)
261276
// 等页面加载完后,获得上一页最后一条消息的位置,控制滚动到它所在位置
262277
scrollbarRef.value!.setScrollTop(innerRef.value!.clientHeight - oldPageHeight)
263278
}
@@ -286,6 +301,8 @@ const showTime = computed(() => (item: KeFuMessageRespVO, index: number) => {
286301
}
287302
288303
&-content {
304+
position: relative;
305+
289306
.newMessageTip {
290307
position: absolute;
291308
bottom: 35px;

src/views/mall/promotion/kefu/index.vue

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ watchEffect(() => {
7575
}
7676
})
7777
// ======================= WebSocket end =======================
78-
7978
/** 加载会话列表 */
8079
const keFuConversationRef = ref<InstanceType<typeof KeFuConversationList>>()
8180
const getConversationList = () => {
@@ -85,7 +84,7 @@ const getConversationList = () => {
8584
/** 加载指定会话的消息列表 */
8685
const keFuChatBoxRef = ref<InstanceType<typeof KeFuMessageList>>()
8786
const handleChange = (conversation: KeFuConversationRespVO) => {
88-
keFuChatBoxRef.value?.getMessageList(conversation)
87+
keFuChatBoxRef.value?.getMessageList(conversation, true)
8988
}
9089
9190
/** 初始化 */

0 commit comments

Comments
 (0)