【Vue】vuecli导航守卫动态改变标题(title)
Vue-cli是快速构建单页应用的脚手架,单页所以只有一个index.html入口,只有一个app实例。但是我们做的项目中,每个页面的标题描述是不同的,又要改变title,所以这里就需要用到导航守卫了Vuecli搭建之类的这里就不详述了…导航守卫:正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由...
Vue-cli
是快速构建单页应用的脚手架,单页所以只有一个index.html入口,只有一个app实例。
但是我们做的项目中,每个页面的标题描述是不同的,又要改变title
,所以这里就需要用到导航守卫
了
Vuecli搭建之类的这里就不详述了…
##导航守卫:
正如其名,vue-router
提供的导航守卫主要用来通过跳转
或取消
的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。
记住参数或查询的改变并不会触发进入/离开的导航守卫。你可以通过观察 $route 对象来应对这些变化,或使用 beforeRouteUpdate
的组件内守卫,里面的参数之类的后面会写到。
进入正题
下面这张图片就是那个唯一的index.html
,我们目标是动态改变title
标签中的内容
先看看没有加守卫导航的时候,地址不同title肯定是相同的。
地址:http://localhost:8080/#/login
地址:http://localhost:8080/#/apply
方法一
接下来开始修改title
1:先给title加上一个id【如上一张图片中的title
】,后面需要用到这个id来指定这个标签,通过innerHTML
来更改内容。
<title id="titleId">test</title>
2:进入router.js中,这里脚手架搭建的时候我就选中了默认安装router,有些同学可能是直接npm安装的,不过无大碍。
这里我们直接在路由配置上直接定义 beforeEnter 守卫
,直接通过原生js获取到id的title标签改变里面的内容。
每个守卫方法接收三个参数:
- to: Route: 即将要进入的目标 路由对象
- from: Route: 当前导航正要离开的路由
- next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
next(’/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: true、name: ‘home’ 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。
next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。
确保要调用 next 方法,否则钩子就不会被 resolved。
最后看效果:
地址:http://localhost:8080/#/login
地址:http://localhost:8080/#/about
导航守卫还可以用作路由拦截等等操作,后面会发布。
方法二
routes: [
{ /* (首页)默认路由地址 */
path: '/',
name: 'login',
component: login,
meta: {
title: '首页入口'
}
},
{
path: '/apply',
name: 'apply',
component: apply,
meta: {
title: '申请'
}
},
{ /* Not Found 路由,必须是最后一个路由 */
path: '*',
component: NotFound,
meta: {
title: '找不到页面'
}
}
]
最后在遍历
router.beforeEach((to, from, next) => {
/* 路由发生变化修改页面title */
if (to.meta.title) {
document.title = to.meta.title
}
next()
})
更多推荐
所有评论(0)