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() {