实现类似微信聊天的功能,但是目前仅仅支持图片文字交流的方式
功能点1.websocket如何在实际开发中使用,前后端约定emit,on事件名,用于前后端联调
const socket = io(baseURL, {
auth: { token: `Bearer ${userStore.basicInfo.token}` },
query: { orderId: props.orderId },
transports: ['websocket', 'polling'],
timeout: 5000,
})
功能点2.接收服务端消息,小功能点包括消息分组
socket.on('connect', () => {
socket.on('chatMsgList', async (e) => {
isRefreshing.value = false
if (e.data.length === 0) return uni.utils.toast('暂无更多聊天记录')
e.data.reverse()
for (const [index, v] of e.data) {
if (index === 0) lastTime.value = currentValue
messageList.value.unshift(
{
id: v.createTime,
msgType: 31,
msg: {
content: v.createTime,
},
},
...v.items
)
}
await nextTick()
scrollTop.value = 10000
})
socket.on('receiveChatMsg', async (msg) => {
socket.emit('updateMsgStatus', msg.id)
messageList.value.push(msg)
await nextTick()
scrollTop.value += 10000
})
.on('statusChange', () => {
getOrderDetail()
})
})
功能点3.向服务端发送消息
socket.emit('sendChatMsg', {
from: userStore.basicInfo.id,
to: orderDetail.value.docInfo.id,
msgType: 4,
msg: {
picture: {
id: res.tempFiles[0].lastModified,
url: res.tempFiles[0].url,
},
},
})
功能点4.下拉刷新,实现历史消息分页
const isRefreshing = ref(false)
const onRefresh = () => {
isRefreshing.value = true
socket.emit(
'getChatMsgList',
20,
lastTime.value,
props.orderId
)
}
功能点6.使用scroll-view 配合:scroll-top="scrollTop"实现,最后一条消息总是显示在列表最底部,而不用自己手动下滑
await nextTick()
scrollTop.value = 10000