Skip to content

Commit 63a42bd

Browse files
committed
feat(pages): enhance content loading with loading state and error handling
1 parent aabb974 commit 63a42bd

File tree

1 file changed

+48
-18
lines changed

1 file changed

+48
-18
lines changed

test/fixtures/content/pages/[key]/[...slug].vue

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,64 @@
88
>
99
Home
1010
</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>
1319
</article>
1420
</template>
1521

16-
<script setup lang="ts">
22+
<script setup>
1723
import { useRoute } from 'vue-router'
18-
import { useI18n, useAsyncData, createError } from '#imports'
24+
import { useI18n, useAsyncData, createError, watch, ref } from '#imports'
1925
2026
const route = useRoute()
2127
const { $getLocale, $localeRoute } = useI18n()
2228
23-
// Удаляем локаль из пути, если она есть
24-
const pathWithoutLocale = route.path.replace(`/${$getLocale()}`, '')
29+
// Реактивная переменная для контента
30+
const doc = ref<null | string>(null)
2531
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()}`, '')
3037
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
3442
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+
}
4053
}
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+
})
4171
</script>

0 commit comments

Comments
 (0)