路由钩子
VitePress 提供的 useRouter
有 4 个路由钩子,分别为:
onBeforeRouteChange
:路由变化前触发,如果在该钩子函数中返回false
,则不会进行路由跳转onBeforePageLoad
:页面加载前执行,在onBeforeRouteChange
之后触发,如果在该钩子函数中返回false
,则不会进行路由跳转onAfterPageLoad
:页面加载后执行onAfterRouteChange
:路由变化后触发,在onAfterPageLoad
之后触发
Teek 内置的 4 个评论区组件使用了 onAfterRouteChange
钩子函数,且 vitepress-plugin-permalink
插件分别使用了 onBeforeRouteChange
和 onAfterRouteChange
两个路由钩子。
如果您也需要使用这些路由钩子,请不要直接这样使用:
ts
router.onAfterRouteChange=(href:string) =>{};
onAfterRouteChange
是一个函数,您这样使用将会 覆盖Teek 在该钩子函数的逻辑,因此您需要这样使用:
vue
<scriptsetuplang="ts">import{useRouter,useData } from"vitepress";constrouter=useRouter();conststate=router.state ||{};conststateKey="xx";if(!state[stateKey]) {constselfOnAfterRouteChange=router.onAfterRouteChange;router.onAfterRouteChange=(href:string) =>{selfOnAfterRouteChange?.(href);myFunction();};router.state ={...state,[stateKey]:true};}constmyFunction=() =>{};</script>
onBeforeRouteChange
支持返回 false 来阻止路由跳转,因此请这样使用:
vue
<scriptsetuplang="ts">import{useRouter,useData } from"vitepress";constrouter=useRouter();conststate=router.state ||{};conststateKey="xx";if(!state[stateKey]) {constselfOnAfterRouteChange=router.onAfterRouteChange;router.onBeforeRouteChange=(href:string) =>{constselfResult=selfOnBeforeRouteChange?.(href);if(selfResult ===false) returnfalse;myFunction();};router.state ={...state,[stateKey]:true};}constmyFunction=() =>{};</script>
useVpRouter
针对上面较为复杂的配置,Teek 已经封装了 Composables 函数 useVpRouter
,该函数对 VitePress 的 router
钩子进行封装,因此您可以这样使用:
vue
<scriptsetuplang="ts">import{useVpRouter } from"vitepress-theme-teek";constvpRouter=useVpRouter();vpRouter.bindAfterRouteChange("xx",() =>{myFunction();});constmyFunction=() =>{};</script>
如果您想一次性绑定多个 router
钩子,可以这样使用:
vue
<scriptsetuplang="ts">import{useVpRouter } from"vitepress-theme-teek";constvpRouter=useVpRouter();vpRouter.bindRouterFn("xx",router=>{router.onBeforeRouteChange=(href:string) =>{constselfResult=selfOnBeforeRouteChange?.(href);if(selfResult ===false) returnfalse;myFunction();};router.onAfterRouteChange=(href:string) =>{selfOnAfterRouteChange?.(href);myFunction();};});constmyFunction=() =>{};</script>