mirror of https://github.com/vuejs/vitepress
parent
ae4102bef7
commit
78722824cb
@ -0,0 +1,48 @@
|
|||||||
|
import { h, shallowRef, watchEffect, inject, nextTick } from 'vue'
|
||||||
|
import { RouteSymbol } from './router'
|
||||||
|
|
||||||
|
const Default404 = () => '404 Not Found'
|
||||||
|
|
||||||
|
export const Content = {
|
||||||
|
setup() {
|
||||||
|
const comp = shallowRef()
|
||||||
|
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
const route = inject(RouteSymbol, {
|
||||||
|
path: '/',
|
||||||
|
scrollPosition: 0
|
||||||
|
})
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
const pendingPath = route.path
|
||||||
|
let pagePath = pendingPath.replace(/\.html$/, '')
|
||||||
|
if (pagePath.endsWith('/')) {
|
||||||
|
pagePath += 'index'
|
||||||
|
}
|
||||||
|
|
||||||
|
// awlays force re-fetch content in dev
|
||||||
|
import(`${pagePath}.md?t=${Date.now()}`)
|
||||||
|
.then(async (m) => {
|
||||||
|
if (route.path === pendingPath) {
|
||||||
|
comp.value = m.default
|
||||||
|
await nextTick()
|
||||||
|
window.scrollTo({
|
||||||
|
left: 0,
|
||||||
|
top: route.scrollPosition,
|
||||||
|
behavior: 'auto'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
if (route.path === pendingPath) {
|
||||||
|
comp.value = Default404
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// TODO SSR
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => (comp.value ? h(comp.value) : null)
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,8 @@
|
|||||||
import { reactive, provide } from 'vue'
|
import { reactive, provide } from 'vue'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {import('vue').InjectionKey<{ path: string, scrollPosition: number }>}
|
||||||
|
*/
|
||||||
export const RouteSymbol = Symbol()
|
export const RouteSymbol = Symbol()
|
||||||
|
|
||||||
export function useRouter() {
|
export function useRouter() {
|
Loading…
Reference in new issue