一.基础介绍
- vue-router用来构建SPA(单页面应用)
- 什么是前端路由?
- 路由是根据不同url地址展示不同的内容或页面
- 前端路由就是把不同路由对应不同的内容或页面的任务交给前端来做,之前是通过服务端根据url的不同返回不同的页面实现的
- 什么时候使用前端路由?
- 在单页面应用,大部分页面结构不变,只改变部分内容的使用
- 前端路由的优缺点:
- 优点:
- 用户体验好,不用每次都从服务器全部获取,可以快速展现给用户
- 缺点:
- 不利于SEO
- 使用浏览器的前进/后退键时会重新发送请求,没有合理地利用缓存
- 单页面无法记住之前滚动的位置,无法在前进/后退时记住滚动的位置
- 优点:
- 分类:
- 动态路由匹配
- 嵌套路由
- 编程式路由
- 命名路由和命名视图(很少用)
二.动态路由
模式 | 匹配路径 | $router.params |
---|---|---|
/user/:username | /user/evan | { username:’evan’ } |
/user/:username/post/:post_id | /user/even/post/123 | {username:’evan’,post_id:123 } |
1 | //index.js中 |
2 | import Vue from 'vue' |
3 | import Router from 'vue-router' |
4 | import GoodsList from './../views/GoodsList'//从某路径引入组件 |
5 | |
6 | Vue.use(Router) |
7 | |
8 | export default new Router({ |
9 | routes:[ |
10 | { |
11 | path:'/goods/:goodsId/user/:name',//通过此path访问组件内容 |
12 | name:'GoodsList', |
13 | component:GoodsList |
14 | } |
15 | ] |
16 | }) |
17 | //组件间传参,组件中写$router.params.goodsId $router.params.name |
三.嵌套路由
- 路由嵌套路由
1 | //index.js中 |
2 | import Vue from 'vue' |
3 | import Router from 'vue-router' |
4 | import GoodsList from './../views/GoodsList'//从某路径引入组件 |
5 | import Goods1 from './../views/Goods1'//从某路径引入子组件 |
6 | import Goods2 from './../views/Goods2' |
7 | |
8 | Vue.use(Router) |
9 | |
10 | export default new Router({ |
11 | routes:[ |
12 | { |
13 | path:'/goods', |
14 | name:'GoodsList', |
15 | component:GoodsList, |
16 | children:[ |
17 | { |
18 | path:'goods1', |
19 | name:'goods1', |
20 | component:Goods1 |
21 | }, |
22 | { |
23 | path:'goods2', |
24 | name:'goods2', |
25 | component:Goods2 |
26 | }, |
27 | ] |
28 | } |
29 | ] |
30 | }) |
1 | //组件GoodsList中引入子组件Goods1和Goods2 |
2 | <template> |
3 | <div> |
4 | <span>{{$router.params.goodsId}}</span> |
5 | <span>{{$router.params.name}}</span> |
6 | <router-link to="/goods/goods1"></router-link> |
7 | <router-link to="/goods/goods2"></router-link> |
8 | <div> |
9 | <router-view></router-view> |
10 | </div> |
11 | </div> |
12 | </template> |
四.编程式路由
- 通过js来实现页面跳转
- $router.push(“name”)
- $router.push({path:”name”})
- $router.push({path:”name?a=123”})或者$router.push({path:”name”,query:{a=123}})
- $router.go(1)
1 | //index.js中 |
2 | import Vue from 'vue' |
3 | import Router from 'vue-router' |
4 | import GoodsList from './../views/GoodsList'//从某路径引入组件 |
5 | import Car from './../views/Car'//从某路径引入子组件 |
6 | |
7 | Vue.use(Router) |
8 | |
9 | export default new Router({ |
10 | routes:[ |
11 | { |
12 | path:'/goods', |
13 | name:'GoodsList', |
14 | component:GoodsList, |
15 | { |
16 | path:'/car', |
17 | component:Car |
18 | } |
19 | } |
20 | ] |
21 | }) |
1 | //组件GoodsList.vue中 |
2 | <template> |
3 | <div> |
4 | <div> |
5 | <router-view></router-view> |
6 | </div> |
7 | <router-link to="/car"></router-link> |
8 | <button @click="jump"></router-link> |
9 | </div> |
10 | </template> |
11 | <script> |
12 | export default{ |
13 | data(){ |
14 | return{ |
15 | msg:'hello vue' |
16 | } |
17 | }, |
18 | methods:{ |
19 | jump(){ |
20 | this.$router.push({path:'/car?goodsId=123'});//可以跳转页面...go... |
21 | } |
22 | } |
23 | } |
24 | </script> |
25 | |
26 | //组件Car.vue中 |
27 | <template> |
28 | <div> |
29 | <span>{{$router.query.goodsId}}</span>//页面间传参 |
30 | </div> |
31 | </template> |
32 | <script> |
33 | export default{ |
34 | data(){ |
35 | return{ |
36 | msg:'hello vue' |
37 | } |
38 | } |
39 | } |
40 | </script> |
五.命名路由/视图
- 给路由定义不同的名字,根据名字进行匹配
- 给不同的router-view定义名字,通过名字进行对应组件的渲染