diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2023-12-15 15:37:19 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2023-12-15 15:37:19 +0900 |
| commit | eacc2040a1a3ef1c28af5293a163289e7ec1958a (patch) | |
| tree | c59589a755f7c20240b3b1a69562f3e0781b1945 /packages/frontend/src/components | |
| parent | perf: early return users/notes and users/featured-notes if me is blocked by r... (diff) | |
| download | misskey-eacc2040a1a3ef1c28af5293a163289e7ec1958a.tar.gz misskey-eacc2040a1a3ef1c28af5293a163289e7ec1958a.tar.bz2 misskey-eacc2040a1a3ef1c28af5293a163289e7ec1958a.zip | |
perf(frontend): introduce MkLazy for lazy loading
Diffstat (limited to 'packages/frontend/src/components')
| -rw-r--r-- | packages/frontend/src/components/global/MkLazy.vue | 53 | ||||
| -rw-r--r-- | packages/frontend/src/components/index.ts | 3 |
2 files changed, 56 insertions, 0 deletions
diff --git a/packages/frontend/src/components/global/MkLazy.vue b/packages/frontend/src/components/global/MkLazy.vue new file mode 100644 index 0000000000..6d7ff4ca49 --- /dev/null +++ b/packages/frontend/src/components/global/MkLazy.vue @@ -0,0 +1,53 @@ +<!-- +SPDX-FileCopyrightText: syuilo and other misskey contributors +SPDX-License-Identifier: AGPL-3.0-only +--> + +<template> +<div ref="rootEl" :class="$style.root"> + <div v-if="!showing" :class="$style.placeholder"></div> + <slot v-else></slot> +</div> +</template> + +<script lang="ts" setup> +import { nextTick, onMounted, onActivated, onBeforeUnmount, ref, shallowRef } from 'vue'; + +const rootEl = shallowRef<HTMLDivElement>(); +const showing = ref(false); + +const observer = new IntersectionObserver( + (entries) => { + if (entries.some((entry) => entry.isIntersecting)) { + showing.value = true; + } + }, +); + +onMounted(() => { + nextTick(() => { + observer.observe(rootEl.value!); + }); +}); + +onActivated(() => { + nextTick(() => { + observer.observe(rootEl.value!); + }); +}); + +onBeforeUnmount(() => { + observer.disconnect(); +}); +</script> + +<style lang="scss" module> +.root { + display: block; +} + +.placeholder { + display: block; + min-height: 150px; +} +</style> diff --git a/packages/frontend/src/components/index.ts b/packages/frontend/src/components/index.ts index c740d181f9..a3e13c3a50 100644 --- a/packages/frontend/src/components/index.ts +++ b/packages/frontend/src/components/index.ts @@ -25,6 +25,7 @@ import MkPageHeader from './global/MkPageHeader.vue'; import MkSpacer from './global/MkSpacer.vue'; import MkFooterSpacer from './global/MkFooterSpacer.vue'; import MkStickyContainer from './global/MkStickyContainer.vue'; +import MkLazy from './global/MkLazy.vue'; export default function(app: App) { for (const [key, value] of Object.entries(components)) { @@ -53,6 +54,7 @@ export const components = { MkSpacer: MkSpacer, MkFooterSpacer: MkFooterSpacer, MkStickyContainer: MkStickyContainer, + MkLazy: MkLazy, }; declare module '@vue/runtime-core' { @@ -77,5 +79,6 @@ declare module '@vue/runtime-core' { MkSpacer: typeof MkSpacer; MkFooterSpacer: typeof MkFooterSpacer; MkStickyContainer: typeof MkStickyContainer; + MkLazy: typeof MkLazy; } } |