【Vue】vuecli导航守卫动态改变标题(title)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33744228/article/details/80684463

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()
})

猜你喜欢

转载自blog.csdn.net/qq_33744228/article/details/80684463