summaryrefslogtreecommitdiff
path: root/packages/frontend/src/components
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2024-02-06 16:26:03 +0900
committerGitHub <noreply@github.com>2024-02-06 16:26:03 +0900
commitedb39a089d6652eb5b0212069f3050823c4c07e7 (patch)
tree65db3ab25af5f2ff23fd698c5099049cda29106b /packages/frontend/src/components
parentenhance(frontend): シンタックスハイライトにテーマを適用で... (diff)
downloadmisskey-edb39a089d6652eb5b0212069f3050823c4c07e7.tar.gz
misskey-edb39a089d6652eb5b0212069f3050823c4c07e7.tar.bz2
misskey-edb39a089d6652eb5b0212069f3050823c4c07e7.zip
enhance(frontend): KeepAliveのページキャッシュを削除できるように (#13180)
* enhance(frontend): 内部のページキャッシュを削除できるように * Update Changelog
Diffstat (limited to 'packages/frontend/src/components')
-rw-r--r--packages/frontend/src/components/global/RouterView.vue42
1 files changed, 37 insertions, 5 deletions
diff --git a/packages/frontend/src/components/global/RouterView.vue b/packages/frontend/src/components/global/RouterView.vue
index dc7474835d..aeb87e659b 100644
--- a/packages/frontend/src/components/global/RouterView.vue
+++ b/packages/frontend/src/components/global/RouterView.vue
@@ -4,7 +4,10 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
-<KeepAlive :max="defaultStore.state.numberOfPageCache">
+<KeepAlive
+ :max="defaultStore.state.numberOfPageCache"
+ :exclude="pageCacheController"
+>
<Suspense :timeout="0">
<component :is="currentPageComponent" :key="key" v-bind="Object.fromEntries(currentPageProps)"/>
@@ -16,9 +19,11 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
-import { inject, onBeforeUnmount, provide, ref, shallowRef } from 'vue';
-import { IRouter, Resolved } from '@/nirax.js';
+import { inject, onBeforeUnmount, provide, ref, shallowRef, computed, nextTick } from 'vue';
+import { IRouter, Resolved, RouteDef } from '@/nirax.js';
import { defaultStore } from '@/store.js';
+import { globalEvents } from '@/events.js';
+import MkLoadingPage from '@/pages/_loading_.vue';
const props = defineProps<{
router?: IRouter;
@@ -46,20 +51,47 @@ function resolveNested(current: Resolved, d = 0): Resolved | null {
}
const current = resolveNested(router.current)!;
-const currentPageComponent = shallowRef(current.route.component);
+const currentPageComponent = shallowRef('component' in current.route ? current.route.component : MkLoadingPage);
const currentPageProps = ref(current.props);
const key = ref(current.route.path + JSON.stringify(Object.fromEntries(current.props)));
function onChange({ resolved, key: newKey }) {
const current = resolveNested(resolved);
- if (current == null) return;
+ if (current == null || 'redirect' in current.route) return;
currentPageComponent.value = current.route.component;
currentPageProps.value = current.props;
key.value = current.route.path + JSON.stringify(Object.fromEntries(current.props));
+
+ nextTick(() => {
+ // ページ遷移完了後に再びキャッシュを有効化
+ if (clearCacheRequested.value) {
+ clearCacheRequested.value = false;
+ }
+ });
}
router.addListener('change', onChange);
+// #region キャッシュ制御
+
+/**
+ * キャッシュクリアが有効になったら、全キャッシュをクリアする
+ *
+ * keepAlive側にwatcherがあるのですぐ消えるとはおもうけど、念のためページ遷移完了まではキャッシュを無効化しておく。
+ * キャッシュ有効時向けにexcludeを使いたい場合は、pageCacheControllerに並列に突っ込むのではなく、下に追記すること
+ */
+const pageCacheController = computed(() => clearCacheRequested.value ? /.*/ : undefined);
+const clearCacheRequested = ref(false);
+
+globalEvents.on('requestClearPageCache', () => {
+ if (_DEV_) console.log('clear page cache requested');
+ if (!clearCacheRequested.value) {
+ clearCacheRequested.value = true;
+ }
+});
+
+// #endregion
+
onBeforeUnmount(() => {
router.removeListener('change', onChange);
});