From 82d065c270aa85896097d03912edafbc83f221c4 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 7 May 2026 20:34:09 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(im):=20=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E6=B6=88=E6=81=AF=E8=BD=AC=E5=8F=91=20v0.2=EF=BC=9A?= =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=88=E4=B8=80=E4=BA=9B=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=E7=AD=89=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/message/MessageBubble.vue | 71 ++++++++++++++++--- .../components/message/MessageItem.vue | 50 +------------ .../components/message/MessagePanel.vue | 7 +- .../manager/message/MessageContentPreview.vue | 36 +--------- 4 files changed, 71 insertions(+), 93 deletions(-) diff --git a/src/views/im/home/pages/conversation/components/message/MessageBubble.vue b/src/views/im/home/pages/conversation/components/message/MessageBubble.vue index 2ce436426..ecbaaa030 100644 --- a/src/views/im/home/pages/conversation/components/message/MessageBubble.vue +++ b/src/views/im/home/pages/conversation/components/message/MessageBubble.vue @@ -215,21 +215,27 @@ const isUploading = computed(() => props.uploadProgress != null) const uploadProgress = computed(() => props.uploadProgress ?? 0) const uploadProgressText = computed(() => `${uploadProgress.value}%`) -/** 各 payload */ -const textPayload = computed(() => (isText.value ? parseMessage(props.content) : null)) +/** + * 单一 parse 入口:content 一变只 parse 一次,按 type 分发到下面 7 个 payload + * + * 各类型 payload 共用同一棵 JSON 树,避免 7 个 computed 各自重 parse 同一份 content + */ +const parsedContent = computed(() => parseMessage(props.content)) + +const textPayload = computed(() => (isText.value ? (parsedContent.value as TextMessage | null) : null)) const imagePayload = computed(() => - isImage.value ? parseMessage(props.content) : null + isImage.value ? (parsedContent.value as ImageMessage | null) : null ) -const filePayload = computed(() => (isFile.value ? parseMessage(props.content) : null)) +const filePayload = computed(() => (isFile.value ? (parsedContent.value as FileMessage | null) : null)) const voicePayload = computed(() => - isVoice.value ? parseMessage(props.content) : null + isVoice.value ? (parsedContent.value as AudioMessage | null) : null ) const videoPayload = computed(() => - isVideo.value ? parseMessage(props.content) : null + isVideo.value ? (parsedContent.value as VideoMessage | null) : null ) -const cardPayload = computed(() => (isCard.value ? parseMessage(props.content) : null)) +const cardPayload = computed(() => (isCard.value ? (parsedContent.value as CardMessage | null) : null)) const mergePayload = computed(() => - isMerge.value ? parseMessage(props.content) : null + isMerge.value ? (parsedContent.value as MergeMessage | null) : null ) /** 合并消息内嵌前 N 条派生「{昵称}:{摘要}」 */ @@ -248,7 +254,7 @@ const facePayload = computed(() => { if (!isFace.value) { return null } - const raw = parseMessage(props.content) + const raw = parsedContent.value as FaceMessage | null if (!raw) { return null } @@ -324,3 +330,50 @@ onBeforeUnmount(() => { voicePlaying.value = false }) + + diff --git a/src/views/im/home/pages/conversation/components/message/MessageItem.vue b/src/views/im/home/pages/conversation/components/message/MessageItem.vue index c52e89c95..b5b34a1e3 100644 --- a/src/views/im/home/pages/conversation/components/message/MessageItem.vue +++ b/src/views/im/home/pages/conversation/components/message/MessageItem.vue @@ -861,55 +861,7 @@ function handleDelete() {