美文网首页
@芥末的糖-----Vue-router

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

作者: 芥末的糖 | 来源:发表于2018-11-10 22:41 被阅读0次
  • 我们使用路由来干什么呢?

    个人理解:在前端我们做单页面的开发时,常使用路由来实现页面的跳转,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 的回调函数

相关文章

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

    我们使用路由来干什么呢?个人理解:在前端我们做单页面的开发时,常使用路由来实现页面的跳转,Vue给出了我们Vue-...

  • @芥末的糖

    1.接下来是一段有故事的代码,如果你能看到最后,那么我相信,这些干货将会让你受益 2.要求变成//循环外:3 ...

  • @芥末的糖-----redux

    以下例子如果看不懂,就直接看总结,然后看最开始的图,然后对应代码目录结构:都在同一个目录下 1.全局注入 2.全局...

  • @芥末的糖-----PropTypes

    1.导入一个包 import PropTypes from 'prop-types' 2.使用PropTypes用...

  • @芥末的糖-----this.setState

    React通过this.state来访问state,通过this.setState来更新state。当setSta...

  • @芥末的糖-----Vuex知识

    一 1.什么是Vuex? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用...

  • @芥末的糖-----TypeScript学习

    女友御用版TS解析 优势: -增加了代码的可阅读和可维护性 安装: 一.基础类型 布尔值 数字 number 字符...

  • @芥末的糖-----fs模块

    用node实现一个检索一个目录下面所有的文件的方法

  • 单词积累之调料(1)

    ①盐:salt ②醋:vinegar ③糖:sugar ④酱油:sauce ⑤芥末:mustard ⑥葱:shal...

  • 北海道 六花亭六色酒心糖 名古屋芥末虾片 又是仙贝故里的一款明星产品,有芥末味,但是不会太刺激,鲜虾味和淡淡芥末味...

网友评论

      本文标题:@芥末的糖-----Vue-router

      本文链接:https://www.haomeiwen.com/subject/pwtzxqtx.html