diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue
index 7f366cd9dd..cba561b812 100644
--- a/packages/frontend/src/components/MkNote.vue
+++ b/packages/frontend/src/components/MkNote.vue
@@ -153,7 +153,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 </template>
 
 <script lang="ts" setup>
-import { computed, inject, onMounted, ref, shallowRef, Ref, defineAsyncComponent, watch } from 'vue';
+import { computed, inject, onMounted, ref, shallowRef, Ref, defineAsyncComponent } from 'vue';
 import * as mfm from 'mfm-js';
 import * as Misskey from 'misskey-js';
 import MkNoteSub from '@/components/MkNoteSub.vue';
@@ -240,7 +240,7 @@ const renoteUri = appearNote.renote ? appearNote.renote.uri : null;
 
 const isMyRenote = $i && ($i.id === note.userId);
 const showContent = ref(false);
-let parsed = appearNote.text ? mfm.parse(appearNote.text) : null;
+const parsed = $computed(() => appearNote.text ? mfm.parse(appearNote.text) : null);
 const urls = parsed ? extractUrlFromMfm(parsed) : null;
 const isLong = shouldCollapsed(appearNote, urls ?? []);
 const collapsed = ref(appearNote.cw == null && isLong);
@@ -272,12 +272,6 @@ useNoteCapture({
 	isDeletedRef: isDeleted,
 });
 
-watch(() => appearNote.text, () => {
-	if (appearNote.text && mfm.parse(appearNote.text) !== parsed) {
-		parsed = mfm.parse(appearNote.text);
-	}
-});
-
 useTooltip(renoteButton, async (showing) => {
 	const renotes = await os.api('notes/renotes', {
 		noteId: appearNote.id,
diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue
index 2151aadd4e..376d4fd55d 100644
--- a/packages/frontend/src/components/MkNoteDetailed.vue
+++ b/packages/frontend/src/components/MkNoteDetailed.vue
@@ -295,7 +295,7 @@ const quoted = ref(false);
 const muted = ref($i ? checkWordMute(appearNote, $i, $i.mutedWords) : false);
 const translation = ref(null);
 const translating = ref(false);
-let parsed = appearNote.text ? mfm.parse(appearNote.text) : null;
+const parsed = $computed(() => appearNote.text ? mfm.parse(appearNote.text) : null);
 const urls = parsed ? extractUrlFromMfm(parsed) : null;
 const showTicker = (defaultStore.state.instanceTicker === 'always') || (defaultStore.state.instanceTicker === 'remote' && appearNote.user.instance);
 const conversation = ref<Misskey.entities.Note[]>([]);
@@ -307,12 +307,6 @@ watch(() => props.expandAllCws, (expandAllCws) => {
 	if (expandAllCws !== showContent.value) showContent.value = expandAllCws;
 });
 
-watch(() => appearNote.text, () => {
-	if (appearNote.text && mfm.parse(appearNote.text) !== parsed) {
-		parsed = mfm.parse(appearNote.text);
-	}
-});
-
 if ($i) {
 	os.api("notes/renotes", {
 		noteId: appearNote.id,