@芥末的糖-----Vue-router

  • 我们使用路由来干什么呢?

    个人理解:在前端我们做单页面的开发时,常使用路由来实现页面的跳转,Vue给出了我们Vue-router插件,来实现我们对组件的切换

>> 4步路由的理解直接搞定--->

//1.引入Vue-router插件
import VueRouter from 'vue-router'
Vue.use(VueRouter)

//2.我们实例化路由对象
const router = new VueRouter({
  mode: 'hash',
  routes
})

//3.在我们的app.js里加载Vue-router模块
new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

//4.定义我们的路由
const routes = [
  {
    path: '/',
    redirect: '/all'
  },
  {
    name: 'all',
    path: '/all',
    component: all,
    children:[
     //子路由(先不管后续讲).....
    ]
    
  },
]

个人总结:一个组件有一个或者多个视图(router-view即为子组件加载的地方,当然写在一个页面也无妨),子组件有多个router-link,一个路由对应一个组件(当然也可以多个),当你访问这个路由时就会加载这个组件。

一 .Vue-router知识点

通常用来一个组件加载多个视图

1.命名视图()

  • 有时候想同时 (同级) 展示多个视图,而不是嵌套展示,例如创建一个布局,有 sidebar (侧导航) 和 main (主内容) 两个视图,这个时候命名视图就派上用场了。你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。
  • 一个视图使用一个组件渲染,因此对于同个路由,多个视图就需要多个组件
<router-view class="view one"></router-view>
<router-view class="view two" name="a"></router-view>
<router-view class="view three" name="b"></router-view>
const router = new VueRouter({
  routes: [
    {
      path: '/',
      components: {
        default: Foo,
        a: Bar,
        b: Baz
      }
    }
  ]
})

2.命名路由

有时候,通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候

 <router-link :to="{ name: 'user', params: { userId: 123}}">User</router-link>         
const router = new VueRouter({
  routes: [
    {
      path: '/user/:userId',
      name: 'user',
      component: User
    }
  ]
})

3.精准匹配(eg:匹配路由全部)

通常实现来高亮

-exact-active-class
配置当链接被精确匹配的时候应该激活的 class。注意默认值也是可以通过路由构造函数选项 linkExactActiveClass 进行全局配置的

<router-view class=" two" name="/a?1" exact-active-class= 'active'></router-view>
<router-view class="three" name="/b?2"  exact-active-class='active></router-view>

4.动态路由

通常我们在一个导航对应一个页面,而且这几个页面调用一个借口,只是传参不同,此时用动态路由

  • 路由中组件载入这么配
const router = new VueRouter({
 routes: [
   // 动态路径参数 以冒号开头
   { path: '/item/:id', 
 component: User }
 ]
})
  • 子组件中router-link传参这么配
 <router-link to="/item/1" tag="li" class="floor-router">
           男装
</router-link>

然后在父组件加载其他的组件中watch路由的变化($route.params)
----上面的案例对应的是({id:1})

二:Vue-router进阶知识

导航守卫

(注意:如果玩过狼人杀的话,这里应该会很好理解,接下来是一套狼人杀的套路!!!)

1.组件内部的守卫

!!仔细看注释

const Foo = {
 template: `...`,
 beforeRouteEnter (to, from, next) {
   // 在渲染该组件的对应路由被 confirm 前调用
   // 不!能!获取组件实例 `this`
   // 因为当守卫执行前,组件实例还没被创建
 },
 beforeRouteUpdate (to, from, next) {
   // 在当前路由改变,但是该组件被复用时调用
   // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
   // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
   // 可以访问组件实例 `this`
 },
 beforeRouteLeave (to, from, next) {
   // 导航离开该组件的对应路由时调用
   // 可以访问组件实例 `this`
 }
}

2.全局钩子

2.1全局守卫

当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中

router.beforeEach((to, from, next) => {
  // ...
})

//确保要调用 next 方法,否则钩子就不会被 resolved。

2.2全局解析守卫

2.5.0 新增

在 2.5.0+ 你可以用 router.beforeResolve 注册一个全局守卫。这和 router.beforeEach 类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用

2.3全局后置钩子

router.afterEach((to, from) => {
  // ...
})

3.路由独享的守卫

可以拦截子组件,只判断当前组件(很少用)

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

组件内部守卫:beforeRouteEnter
beforeRouteUpdate (2.2 新增)
beforeRouteLeave
全局守卫:beforeEach
afterEach
beforeResolve
路由守卫:beforeEnter

5.路由元信息

通常用来做路由转化,监听路由来实现 过度动画

完整的导航解析流程

  • 导航被触发。
  • 在失活的组件里调用离开守卫。
  • 调用全局的 beforeEach 守卫。
  • 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
  • 在路由配置里调用 beforeEnter。
  • 解析异步路由组件。
  • 在被激活的组件里调用 beforeRouteEnter。
  • 调用全局的 beforeResolve 守卫 (2.5+)。
  • 导航被确认。
  • 调用全局的 afterEach 钩子。
  • 触发 DOM 更新。
  • !! 用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 vue-router是什么:是vue.js官方的路由管理器和vue.js的核心深度的集成,让开发者更加简单的...
    GUAN_one阅读 3,855评论 0 2
  • 学习目的 学习Vue的必备技能,必须 熟练使用 Vue-router,能够在实际项目中运用。 Vue-rout...
    _1633_阅读 92,853评论 3 58
  • 回忆: 我们知道,h5的history或者hash帮助我们解决了,变化url跳转页面不发送请求,并且我们能监听到u...
    LoveBugs_King阅读 3,813评论 0 5
  • 导航守卫 导航守卫主要用来通过跳转或取消的方式守卫导航。 参数或查询的改变并不会触发进入/离开的导航守卫。 1、全...
    SailingBytes阅读 1,224评论 1 3
  • 介绍 vue-router是一个vue插件。其实质是在location.hash、location.replace...
    AmazRan阅读 1,651评论 0 6

友情链接更多精彩内容