5
5
</el-header >
6
6
<el-main class =" kefu-content overflow-visible" >
7
7
<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" >
9
9
<!-- 消息列表 -->
10
10
<div v-for =" (item, index) in getMessageList0" :key =" item.id" class =" w-[100%]" >
11
11
<div class =" flex justify-center items-center mb-20px" >
@@ -121,17 +121,25 @@ const conversation = ref<KeFuConversationRespVO>({} as KeFuConversationRespVO) /
121
121
const showNewMessageTip = ref (false ) // 显示有新消息提示
122
122
const queryParams = reactive ({
123
123
pageNo: 1 ,
124
+ pageSize: 10 ,
124
125
conversationId: 0
125
126
})
126
127
const total = ref (0 ) // 消息总条数
127
-
128
+ const refreshContent = ref ( false ) // 内容刷新,主要解决会话消息页面高度不一致导致的滚动功能精度失效
128
129
/** 获得消息列表 */
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
+ }
130
139
conversation .value = val
131
140
queryParams .conversationId = val .id
132
141
// 情况一:已经加载完所有消息
133
- const messageTotal = messageList .value .length
134
- if (total .value > 0 && messageTotal > 0 && messageTotal === total .value ) {
142
+ if (skipGetMessageList .value ) {
135
143
return
136
144
}
137
145
const res = await KeFuMessageApi .getKeFuMessagePage (queryParams )
@@ -148,6 +156,7 @@ const getMessageList = async (val: KeFuConversationRespVO) => {
148
156
messageList .value .push (item )
149
157
}
150
158
}
159
+ refreshContent .value = true
151
160
await scrollToBottom ()
152
161
}
153
162
@@ -164,7 +173,7 @@ const refreshMessageList = async () => {
164
173
}
165
174
166
175
queryParams .pageNo = 1
167
- await getMessageList (conversation .value )
176
+ await getMessageList (conversation .value , false )
168
177
if (loadHistory .value ) {
169
178
// 右下角显示有新消息提示
170
179
showNewMessageTip .value = true
@@ -173,6 +182,10 @@ const refreshMessageList = async () => {
173
182
174
183
defineExpose ({ getMessageList , refreshMessageList })
175
184
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
+ }) // 跳过消息获取
176
189
177
190
/** 处理表情选择 */
178
191
const handleEmojiSelect = (item : Emoji ) => {
@@ -212,7 +225,7 @@ const sendMessage = async (msg: any) => {
212
225
await KeFuMessageApi .sendKeFuMessage (msg )
213
226
message .value = ' '
214
227
// 加载消息列表
215
- await getMessageList (conversation .value )
228
+ await getMessageList (conversation .value , false )
216
229
// 滚动到最新消息处
217
230
await scrollToBottom ()
218
231
}
@@ -242,8 +255,7 @@ const handleToNewMessage = async () => {
242
255
/** 加载历史消息 */
243
256
const loadHistory = ref (false ) // 加载历史消息
244
257
const handleScroll = async ({ scrollTop }) => {
245
- const messageTotal = messageList .value .length
246
- if (total .value > 0 && messageTotal > 0 && messageTotal === total .value ) {
258
+ if (skipGetMessageList .value ) {
247
259
return
248
260
}
249
261
// 触顶自动加载下一页数据
@@ -253,11 +265,14 @@ const handleScroll = async ({ scrollTop }) => {
253
265
}
254
266
const handleOldMessage = async () => {
255
267
// 记录已有页面高度
256
- const oldPageHeight = innerRef .value ! .clientHeight
268
+ const oldPageHeight = innerRef .value ?.clientHeight
269
+ if (! oldPageHeight ) {
270
+ return
271
+ }
257
272
loadHistory .value = true
258
273
// 加载消息列表
259
274
queryParams .pageNo += 1
260
- await getMessageList (conversation .value )
275
+ await getMessageList (conversation .value , false )
261
276
// 等页面加载完后,获得上一页最后一条消息的位置,控制滚动到它所在位置
262
277
scrollbarRef .value ! .setScrollTop (innerRef .value ! .clientHeight - oldPageHeight )
263
278
}
@@ -286,6 +301,8 @@ const showTime = computed(() => (item: KeFuMessageRespVO, index: number) => {
286
301
}
287
302
288
303
& -content {
304
+ position : relative ;
305
+
289
306
.newMessageTip {
290
307
position : absolute ;
291
308
bottom : 35px ;
0 commit comments