1
1
<template >
2
- <el-container v-if =" showChatBox " class =" kefu" >
2
+ <el-container v-if =" showKeFuMessageList " class =" kefu" >
3
3
<el-header >
4
4
<div class =" kefu-title" >{{ conversation.userNickname }}</div >
5
- </el-header >
6
- <el-main class =" kefu-content overflow-visible" >
7
5
<!-- 加载历史消息 -->
8
6
<div
9
7
v-show =" loadingMore"
12
10
>
13
11
加载更多
14
12
</div >
13
+ </el-header >
14
+ <el-main class =" kefu-content overflow-visible" >
15
15
<el-scrollbar ref =" scrollbarRef" always height =" calc(100vh - 495px)" @scroll =" handleScroll" >
16
16
<div ref =" innerRef" class =" w-[100%] pb-3px" >
17
17
<!-- 消息列表 -->
@@ -119,7 +119,7 @@ import relativeTime from 'dayjs/plugin/relativeTime'
119
119
120
120
dayjs .extend (relativeTime )
121
121
122
- defineOptions ({ name: ' KeFuMessageBox ' })
122
+ defineOptions ({ name: ' KeFuMessageList ' })
123
123
124
124
const message = ref (' ' ) // 消息弹窗
125
125
@@ -137,17 +137,24 @@ const total = ref(0) // 消息总条数
137
137
const getMessageList = async (val : KeFuConversationRespVO ) => {
138
138
conversation .value = val
139
139
queryParams .conversationId = val .id
140
+ // 情况一:已经加载完所有消息
140
141
const messageTotal = messageList .value .length
141
142
if (total .value > 0 && messageTotal > 0 && messageTotal === total .value ) {
142
143
return
143
144
}
144
145
const res = await KeFuMessageApi .getKeFuMessagePage (queryParams )
145
146
total .value = res .total
146
- for (const item of res .list ) {
147
- if (messageList .value .some ((val ) => val .id === item .id )) {
148
- continue
147
+ // 情况二:加载最新消息
148
+ if (queryParams .pageNo === 1 ) {
149
+ messageList .value = res .list
150
+ } else {
151
+ // 情况三:加载历史消息
152
+ for (const item of res .list ) {
153
+ if (messageList .value .some ((val ) => val .id === item .id )) {
154
+ continue
155
+ }
156
+ messageList .value .push (item )
149
157
}
150
- messageList .value .push (item )
151
158
}
152
159
await scrollToBottom ()
153
160
}
@@ -167,13 +174,13 @@ const refreshMessageList = async () => {
167
174
queryParams .pageNo = 1
168
175
await getMessageList (conversation .value )
169
176
if (loadHistory .value ) {
170
- // 有下角显示有新消息提示
177
+ // 右下角显示有新消息提示
171
178
showNewMessageTip .value = true
172
179
}
173
180
}
174
181
175
182
defineExpose ({ getMessageList , refreshMessageList })
176
- const showChatBox = computed (() => ! isEmpty (conversation .value )) // 是否显示聊天区域
183
+ const showKeFuMessageList = computed (() => ! isEmpty (conversation .value )) // 是否显示聊天区域
177
184
178
185
/** 处理表情选择 */
179
186
const handleEmojiSelect = (item : Emoji ) => {
@@ -252,12 +259,15 @@ const handleScroll = async ({ scrollTop }) => {
252
259
loadingMore .value = scrollTop < 20
253
260
}
254
261
const handleOldMessage = async () => {
262
+ // 记录已有页面高度
263
+ const oldPageHeight = innerRef .value ! .clientHeight
255
264
loadHistory .value = true
256
265
// 加载消息列表
257
266
queryParams .pageNo += 1
258
267
await getMessageList (conversation .value )
259
268
loadingMore .value = false
260
- // TODO puhui999: 等页面加载完后,获得上一页最后一条消息的位置,控制滚动到它所在位置
269
+ // 等页面加载完后,获得上一页最后一条消息的位置,控制滚动到它所在位置
270
+ scrollbarRef .value ! .setScrollTop (innerRef .value ! .clientHeight - oldPageHeight )
261
271
}
262
272
263
273
/**
@@ -283,23 +293,18 @@ const showTime = computed(() => (item: KeFuMessageRespVO, index: number) => {
283
293
line-height : 60px ;
284
294
}
285
295
286
- & -content {
287
- position : relative ;
288
-
289
- .loadingMore {
290
- position : absolute ;
291
- top : 0 ;
292
- left : 0 ;
293
- width : 100% ;
294
- height : 50px ;
295
- background-color : #eee ;
296
- color : #666 ;
297
- text-align : center ;
298
- line-height : 50px ;
299
- transform : translateY (-100% );
300
- transition : transform 0.3s ease-in-out ;
301
- }
296
+ .loadingMore {
297
+ width : 100% ;
298
+ height : 50px ;
299
+ background-color : #eee ;
300
+ color : #666 ;
301
+ text-align : center ;
302
+ line-height : 50px ;
303
+ transform : translateY (-100% );
304
+ transition : transform 0.3s ease-in-out ;
305
+ }
302
306
307
+ & -content {
303
308
.newMessageTip {
304
309
position : absolute ;
305
310
bottom : 35px ;
0 commit comments