客服:重构消息列表渲染逻辑和样式

This commit is contained in:
puhui999
2024-07-15 18:05:59 +08:00
parent a95a04085b
commit c8feb58a46
+52 -10
View File
@@ -6,8 +6,9 @@
:scroll-y="true"
:scroll-top="currentTop"
@scroll="handleScroll"
@scrolltolower="handleScrolltolower"
>
<view ref="innerRef" v-if="refreshContent" style="width: 100%; padding-bottom: 10rpx">
<view ref="messageViewRef" class="messageView" v-if="refreshContent" style="width: 100%; padding-bottom: 10rpx">
<!-- 消息渲染 -->
<view class="message-item ss-flex-col scroll-item" v-for="(item, index) in getMessageList0" :key="item.id">
<view class="ss-flex ss-row-center ss-col-center">
@@ -109,23 +110,25 @@
</template>
<script setup>
import { computed, getCurrentInstance, nextTick, reactive, ref, unref } from 'vue';
import dayjs from 'dayjs';
import _ from 'lodash'
import { KeFuMessageContentTypeEnum, UserTypeEnum } from '@/pages/chat/util/constants';
import { emojiList } from '@/pages/chat/util/emoji';
import { isEmpty } from '@/sheep/helper/utils';
import sheep from '@/sheep';
import KeFuApi from '@/sheep/api/promotion/kefu';
import { formatDate } from '@/sheep/util';
import GoodsItem from '@/pages/chat/components/goods.vue';
import OrderItem from '@/pages/chat/components/order.vue';
import { computed, nextTick, reactive, ref, unref } from 'vue';
import dayjs from 'dayjs';
import { emojiList } from '@/pages/chat/util/emoji';
import { isEmpty } from '@/sheep/helper/utils';
const { safeArea } = sheep.$platform.device;
const pageHeight = safeArea.height - 44 - 35 - 50;
const vm = getCurrentInstance();
const getMessageContent = computed(() => (item) => JSON.parse(item.content)); // 解析消息内容
const messageList = ref([]); // 消息列表
const currentTop = ref(0); // 当前距顶位置
const showNewMessageTip = ref(true); // 显示有新消息提示
const showNewMessageTip = ref(false); // 显示有新消息提示
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
@@ -177,7 +180,7 @@
defineExpose({ getMessageList, refreshMessageList });
/** 滚动到底部 */
const innerRef = ref();
const messageViewRef = ref();
const scrollToBottom = async () => {
// 1. 首次加载时滚动到最新消息,如果加载的是历史消息则不滚动
if (loadHistory.value) {
@@ -185,7 +188,12 @@
}
// 2. 滚动到最新消息,关闭新消息提示
await nextTick();
currentTop.value = innerRef.value.$el.clientHeight;
// #ifdef MP
currentTop.value = await getMessageViewHeight();
// #endif
// #ifdef H5
currentTop.value = messageViewRef.value.$el.clientHeight;
// #endif
showNewMessageTip.value = false;
};
@@ -202,13 +210,22 @@
return;
}
// 触顶自动加载下一页数据
console.log(event.detail.scrollTop);
if (event.detail.scrollTop === 0) {
await handleOldMessage();
// 防抖
// _.debounce(handleOldMessage, 200)
}
};
const handleOldMessage = async () => {
// 记录已有页面高度
const oldPageHeight = innerRef.value.$el.clientHeight;
let oldPageHeight = 0;
// #ifdef MP
oldPageHeight = await getMessageViewHeight();
// #endif
// #ifdef H5
oldPageHeight = messageViewRef.value.$el.clientHeight;
// #endif
if (!oldPageHeight) {
return;
}
@@ -217,10 +234,35 @@
queryParams.pageNo += 1;
await getMessageList();
// 等页面加载完后,获得上一页最后一条消息的位置,控制滚动到它所在位置
currentTop.value = innerRef.value.$el.clientHeight - oldPageHeight;
// #ifdef MP
// TODO puhui999: 微信滚动条定位还是有点问题,页面会闪烁
currentTop.value = (await getMessageViewHeight()) - oldPageHeight - 127;
// #endif
// #ifdef H5
currentTop.value = messageViewRef.value.$el.clientHeight - oldPageHeight;
// #endif
};
// 触底事件
const handleScrolltolower = () => {
// refreshContent.value = false;
// loadHistory.value = false;
// // messageList.value = messageList.value.slice(0, 10)
};
/**
* 获得消息列表高度
*/
const getMessageViewHeight = () => {
return new Promise((resolve, reject) => {
uni.createSelectorQuery().in(vm).select('.messageView').boundingClientRect((rect) => {
console.log(rect);
resolve(rect.height);
}).exec();
});
};
//======================= 工具 =======================
const showTime = computed(() => (item, index) => {
if (unref(messageList.value)[index + 1]) {
let dateString = dayjs(unref(messageList.value)[index + 1].createTime).fromNow();