一 什么是导航守卫?
vue-router提供的导航守卫主要用来监听监听路由的进入和离开
的.
vue-router提供了beforeEnter
和afterEnter
的钩子函数, 它们会在路由即将改变前和改变后触发.
二 导航守卫的需求例子
我们来考虑一个需求: 在一个SPA应用中, 如何改变网页的标题呢?
但是我们可以在Vue中<script>内通过JavaScript来修改<title>的内容.window.document.title = '新的标题'.
那么我们如何利用Vue自身的方法进行更改呢?
普通的修改方式:
- 我们比较容易想到的修改标题的位置是每一个路由对应的组件.vue文件中.通过mounted声明周期函数, 执行对应的代码进行修改即可.
created(){document.title='首页' }
- 但是当页面比较多时, 这种方式不容易维护(因为需要在多个页面执行类似的代码),这时候我们可以用导航守卫
导航守卫实际应用
我们可以利用beforeEnter来完成标题的修改.
- 首先, 我们可以在钩子当中定义一些标题, 可以利用meta来定义
- 其次, 利用导航守卫,修改我们的标题.
导航钩子的三个参数解析:
- to: 即将要进入的目标的路由对象.
- from: 当前导航即将要离开的路由对象.
- next: 调用该方法后, 才能进入下一个钩子(或者说下一个组件).
使用 如果我们想在一个index.js里使用全局导航守卫不再重新到main.js中去定义的话,需要将router的定义和导出分开eg: 效果图注意地址栏上方标题变化
导航守卫其他内容
- 补充一:如果是后置钩子, 也就是afterEach, 不需要主动调用next()函数.
- 补充二: 上面我们使用的导航守卫, 被称之为全局守卫.
- 其他的还有路由独享的守卫,组件内的守卫.
- 另外关于导航守卫还有一些其他的属性控制让我们可以更好的去定制自己的项目.
比如我们如果我们可以在next里指定跳转的组件,比如判断未登陆后我们用next('/login')指向一个路有名为login的组件去调转登陆.
关于补充内容可以查看Vue-router官网定义https://router.vuejs.org/zh/guide/advanced/navigation-guards.html
二 .keep-alive
正常情况下,每次我们进入组件都会执行新创建一个组件(created)我们每次离开组件后组件都会被销毁(destroyed),而我们用了keep-alive就不一样了.
keep-alive 是 Vue 内置的一个组件,可以·使被包含的组件保留状态,或避免重新渲染。·
它们有两个非常重要的属性用来控制我们实现哪些组件被缓存哪些不:(不使用的话全部缓存)
- include - 字符串或正则表达,只有匹配的组件会被缓存
- exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存
使用方法 : router-view 也是一个组件,如果直接被包在 keep-alive 里面,所有路径匹配到的视图组件都会被缓存:
需求实例
我们这里有个需求,要求我们点击about时候可以保存home页面的状态,包括子组件的状态。
实现方法:
1:用keep-alive包裹住想长存的界面
2.这里用到了组件内导航守卫
关于keep-alive的两个属性,可以帮助我们控制哪些组件被缓存哪些不
- include - 字符串或正则表达,只有匹配的组件会被缓存
- exclude- 字符串或正则表达式,任何匹配的组件都不会被缓存
网友评论