|  | 
| 8 | 8 |   > | 
| 9 | 9 |     Home | 
| 10 | 10 |   </NuxtLink> | 
| 11 |  | -  <article> | 
| 12 |  | -    <ContentRenderer :value="doc" /> | 
|  | 11 | +  <article class="data-item"> | 
|  | 12 | +    <ContentRenderer | 
|  | 13 | +      v-if="doc" | 
|  | 14 | +      :value="doc" | 
|  | 15 | +    /> | 
|  | 16 | +    <div v-else> | 
|  | 17 | +      Loading... | 
|  | 18 | +    </div> | 
| 13 | 19 |   </article> | 
| 14 | 20 | </template> | 
| 15 | 21 | 
 | 
| 16 |  | -<script setup lang="ts"> | 
|  | 22 | +<script setup> | 
| 17 | 23 | import { useRoute } from 'vue-router' | 
| 18 |  | -import { useI18n, useAsyncData, createError } from '#imports' | 
|  | 24 | +import { useI18n, useAsyncData, createError, watch, ref } from '#imports' | 
| 19 | 25 | 
 | 
| 20 | 26 | const route = useRoute() | 
| 21 | 27 | const { $getLocale, $localeRoute } = useI18n() | 
| 22 | 28 | 
 | 
| 23 |  | -// Удаляем локаль из пути, если она есть | 
| 24 |  | -const pathWithoutLocale = route.path.replace(`/${$getLocale()}`, '') | 
|  | 29 | +// Реактивная переменная для контента | 
|  | 30 | +const doc = ref<null | string>(null) | 
| 25 | 31 | 
 | 
| 26 |  | -// Загружаем контент, удаляя начальный "/" для корректного пути в queryContent | 
| 27 |  | -const docPath = pathWithoutLocale.startsWith('/') | 
| 28 |  | -  ? pathWithoutLocale.slice(1) | 
| 29 |  | -  : pathWithoutLocale | 
|  | 32 | +// Функция для загрузки контента | 
|  | 33 | +const loadContent = async (path) => { | 
|  | 34 | +  try { | 
|  | 35 | +    // Удаляем локаль из пути, если она есть | 
|  | 36 | +    const pathWithoutLocale = path.replace(`/${$getLocale()}`, '') | 
| 30 | 37 | 
 | 
| 31 |  | -// eslint-disable-next-line @typescript-eslint/ban-ts-comment | 
| 32 |  | -// @ts-ignore | 
| 33 |  | -const { data: doc } = await useAsyncData(() => queryCollection('content').path(`/${docPath}`).first()) | 
|  | 38 | +    // Загружаем контент, удаляя начальный "/" для корректного пути в queryContent | 
|  | 39 | +    const docPath = pathWithoutLocale.startsWith('/') | 
|  | 40 | +      ? pathWithoutLocale.slice(1) | 
|  | 41 | +      : pathWithoutLocale | 
| 34 | 42 | 
 | 
| 35 |  | -if (!doc.value) { | 
| 36 |  | -  throw createError({ | 
| 37 |  | -    statusCode: 404, | 
| 38 |  | -    statusMessage: 'Page Not Found', | 
| 39 |  | -  }) | 
|  | 43 | +    // eslint-disable-next-line @typescript-eslint/ban-ts-comment | 
|  | 44 | +    // @ts-ignore | 
|  | 45 | +    const { data } = await useAsyncData(`content-${docPath}`, () => queryCollection('content').path(`/${docPath}`).first()) | 
|  | 46 | +
 | 
|  | 47 | +    doc.value = data.value | 
|  | 48 | +  } | 
|  | 49 | +  catch (error) { | 
|  | 50 | +    console.error('Failed to load content:', error) | 
|  | 51 | +    doc.value = null | 
|  | 52 | +  } | 
| 40 | 53 | } | 
|  | 54 | +
 | 
|  | 55 | +// Следим за изменениями маршрута и обновляем контент | 
|  | 56 | +watch(() => route.path, async (newPath) => { | 
|  | 57 | +  if (newPath) { | 
|  | 58 | +    await loadContent(newPath) | 
|  | 59 | +  } | 
|  | 60 | +}, { immediate: true }) | 
|  | 61 | +
 | 
|  | 62 | +// Проверяем наличие контента | 
|  | 63 | +watch(doc, (newDoc) => { | 
|  | 64 | +  if (newDoc === null) { | 
|  | 65 | +    throw createError({ | 
|  | 66 | +      statusCode: 404, | 
|  | 67 | +      statusMessage: 'Page Not Found', | 
|  | 68 | +    }) | 
|  | 69 | +  } | 
|  | 70 | +}) | 
| 41 | 71 | </script> | 
0 commit comments