vue-router用法

2019-08-22  本文已影响0人  卡拉咖啦

开始之前

SPA(single page application):单一页面应用程序,只有一个完整的页面;它在加载页面时,不会加载整个页面,而是只更新某个指定的容器中内容。
大型单页应用最显著特点之一就是采用前端路由系统,核心在于更新视图而不重新请求页面

this.$router : 指在根组件引入的整个 router ;
this.$route : 当前组件对应的 route

准备工作

//1.引入:
import router from 'vue-router'
Vue.use(router)
//2.创建一个路由

var rt = new router({
routes:[
 // ...
]
})

//3.在根组件中加入 router 属性
new Vue({
  el: '#app',
  router:rt,
  components: { App },
  template: '<App/>'
})

最基本用法

//设置路由
var rt = new router({
routes:[
  {
    path: "/a",
    components: A // 组件 A
  }
]
})

// router-link
// 在根组件的任何子组件中:
<router-link to="/a"> ... </router-link>

//点击 `router-link` 标签内的内容就会选择第一个路径匹配的路由(这里是 '/a'), 在根组件的 <router-view> 中显示组件 A 的内容

动态路由匹配(Dynamic Route Matching)

动态路由匹配允许我们导向同一个路由的时候传输不同数据(path),使用 : 号:

//in <router-link>:
<router-link to="/a/BB/c/DD"></router-link>

//in routes:
{
  path: "/a/:b/c/:d",
  component: ...
}

//上面两个路径是匹配的,结果是 路径变为 /a/BB/c/DD, 并且组件通过 this.$route.params 中得到了两个参数:
// this.$route.params.b = "BB"
// this.$route.params.d = "DD"

也就是说,有":"号的部分可以动态匹配,接收参数

命名路由

每个路由可以直接设置一个 name 属性,这样我们在 <router-link> to 属性中使用同样的 name 就可以进行路由了:

//设置路由
routes:[
  {
    name: a,
    path: "/a",
    components:{
      keya: A,   // 组件 A
      keyb: B    // 组件 B
      }
  }
]
})

// router-link
// 在根组件的任何子组件中
<router-link :to="{
  name: 'a',
  params: {
    a1: 1,  //参数 a1
    a2: 2   //参数 a2, 这两个参数也可以在当前路由对应的组件 this.$route.params 中找到
  }
  }"> ... </router-link>

命名路由 VS 非命名路由

1.匹配:命名路由是通过 name 属性匹配;非命名路由是通过 path 匹配;
2.参数传递:命名路由通过 params 把参数传给路由; 非命名路由无法用 params 传参,子组件的 this.$route.params 中属性是通过 path 的匹配获得。
3.路径格式:命名路由的路径格式是在路由中写好的,获取到参数后,路径中的 ":"+ 变量名 会被变量的值替换;而非命名路由在 <router-link> 中就确定了。

router-view

<router-view>就是当前路由对应的子组件所要渲染的位置

子路由

上面的 <router-view> 是出现在根组件中,也就是引入了 router 的 Vue 实例,如果我们需要子组件的内部也会根据参数、路径的差异而显示不同内容,vue 提供了一个 子路由(在路由中,使用 childrens 属性)

routes: [
    { path: '/user/:id', component: XXX,
      children: [
        {
          //  路径为 /user/:id/a 时,这部分在组件 XXX 中的 <router-view> 显示
          path: 'a',
          component: A // 组件A
        },
        {
          //  路径为 /user/:id/b 时,这部分在组件 XXX 中的 <router-view> 显示
          path: 'b',
          component: B //组件 B
        }
      ]
    }
  ]

两个 name 属性

<router-link><router-view>中都用到 name 属性:
<router-link> 的 name 属性对应的是路由的 name;
<router-view> 的 name 属性对应的是当前路由中 "key" 与 name 相匹配的组件;

其它

1.* 是全匹配,这个对应的路由一般放到最后(路由匹配的优先级排序是从前往后),用于处理 404;
2.重复利用,当我们连续使用同一个路由(只是修改了参数)的时候,直接是重复利用原来的路由、组件,不会触发新的生命周期,这个时候可以考虑使用:
1)watch 观察路由数据:

watch: {
  '$route' (to, from) {
    // 对路由变化作出响应...
  }
}

2)用 beforeRouteUpdate 钩子

上一篇下一篇

猜你喜欢

热点阅读