VUE-8.路由

vue的路由使用在SPA应用中的组件跳转,相当于多页面的 a标签。官网

引入js文件的方式

引入vue-router.js文件
<script src="js/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
定义若干个组件(为了跳转用)
let goodlist = {
   template:"<div>商品列表</div>"
}

let goodsdetail = {
   template:"<div>商品详情</div>"
}
定义路由对象
1 路由配置(json数组)
let routes = [
    {path:'/goodslist',component:goodlist},
    {path:'/goodsdetail',component:goodsdetail}
];

2 实例化一个vueRouter对象  
let router = new VueRouter({
       routes
});
挂载vueRouter对象

实例化vue对象,(把vueRouter对象,挂载(注册)到vue对象里)

let vm = new Vue({
    el:"#app",
    router
});
跳转代码(声明式)
    <div id="app">
        <h1>路由跳转</h1>
        <hr/>
        <router-link to='/goodslist'>商品列表</router-link>
        <router-link to='/goodsdetail'>商品详情</router-link>
        <hr/>
        <router-view></router-view>
    </div>
解释:
  • ==<router-link></router-link>: 超链, 相当于标签a 。==
  • ==<router-view></router-view>: 组件显示的位置。==

模块化的方式(脚手架里)

脚手架安装时,会默认安装vue-router。

安装

npm i vue-router -S

定义组件(单文件组件)

如:HelloWorld.vue

路由配置和引入

创建vueRouter对象(定义路由对象,配置路由)
// src/router/index.js
import Vue from 'vue'

//1. 引入路由包
import Router from 'vue-router'

//2. 安装插件包到Vue上, 使用
Vue.use(Router)

//3. 路由配置
let routes = [
  {path: '/', component: HelloWorld}
  {path: '/home',component: Home}, //route  一条路由的配置
]

//4.路由实例
let router = new Router({ //插件路由对象
  // routes:routes
  routes,
});

//5.导出路由实例,让它去控制vue根
export default router
在main.js中引入vueRouter对象,并植入到根属性**
// src/main.js
import router from './router/index';

new Vue({
  el: '#app',
  router,
  ………………
})

跳转

声明式跳转
<router-link to="/home">声明式跳转</router-link>
<router-link to="/home" tag='li'    active-class='类名' >声明式跳转</router-link>

<router-view>展示区</router-view>
router-link 组件属性:
  • to:跳转的路径
  • tag='li' 指定编译后的标签,默认是 a 标签。
  • active-class='类名' 指定激活后的样式 模糊匹配
  • exact-active-class='类名' 指定激活后的样式 严格匹配
  • router-link和router-view组件是vue-router插件提供的
编程式跳转(编程式导航)
先了解router和route
  • $router: 表示vueRouter对象,由于我们在vue对象里把vueRouter对象植入到根属性里,所以,在组件内部是可以使用$router拿到该对象的。
  • $route:表示匹配到的当前路由,可以简单粗暴的理解为,路由配置中的某个json对象。当然,这个对象里的信息比路由配置的更多。
编程式导航
  • this.$router.push(字符串/对象): 添加一个路由 (记录到历史记录)
// 字符串
$router.push('home')

// 对象
$router.push({ path: 'home' })
  • this.$router.replace({name:'...'}) //替换一个路由 (不记录到历史记录)
  • this.$router.go(-1|1)|back() //回退/前进

动态路由匹配

1、路由参数

路由配置

const router = new VueRouter({
  routes: [
    // 动态路径参数 以冒号开头,相当于在path里声明了一个变量 id
    { path: '/user/:id', component: User }
  ]
})

跳转

//匹配上 '/user/:id' 路径,01001的值会赋给id
<router-link to="/user/01001">用户01001的信息</router-link>

组件中获取id的值

 模板里的写法:
 $route.params.id 
 
 脚本里的写法:
 this.$route.params.id

2、捕获所有路由或 404 Not found 路由

1)、通配符 *

'*'  会匹配所有路径
'/user-*'  会匹配以 `/user-` 开头的任意路径

注意:路由匹配的顺序是按照路由配置的顺序进行的,所以,你肯定不能把 * 的路径放在最前面,否则,后面的路由配置都不起作用了。

当使用一个通配符时,$route.params 内会自动添加一个名为 pathMatch 参数。它包含了 URL 通过通配符被匹配的部分。

如:

路由配置:

{
  // 会匹配以 `/user-` 开头的任意路径
  path: '/user-*'
}

路由跳转:

this.$router.push('/user-admin')

组件里:

this.$route.params.pathMatch // 'admin'

404

{
  path: '*',
  component: NoPage组件
}

命名路由

给路由起个名字,就可以使用名字来指定路由

1、路由配置

const router = new VueRouter({
  routes: [
    {
      path: '/user/:userId',
      name: 'user',
      component: User
    }
  ]
})

2、跳转

<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>

重定向

{
  path: '/',  //默认页
  redirect: '/home' //配置型跳转
}, 

总结:路由传参:

一、params

1、传:

1)、动态路由匹配(路由配置里写)

{ path: '/user/:id', component: User }

2)、跳转时传参

1)、跳转时,使用字符串
//声明式
<router-link to="/user/01001">用户01001的信息</router-link>
//编程式
$router.push("/user/01001");

   
2)、跳转时,使用对象
//声明式: 命名的路由,同时传参
<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>
//编程式:
$router.push({ name: 'user', params: { userId: '123' }})

2、接:

 //模板里的写法:
 $route.params.参数名
 
 //脚本里的写法:
 this.$route.params.参数名

二、query

1、传:


// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})
注意:如果提供了 path,那么params 会被忽略

name 对应params

path对应query

2、接

 //模板里的写法:
 $route.query.参数名
 
 //脚本里的写法:
 this.$route.query.参数名

路由传参和props

​ 一个组件在项目中,有两种使用方式(组件显示在浏览器上):

​ 1、自定义标签的方式,外部给组件传数据,用props

​ 2、使用路由跳转的方式,外部给组件传数据,用params或者query。

​ 如果, 一个组件需要从外部传入数据, 并且在项目中,这两种方式的使用都会出现,那么,在组件内部就需要适应这两种情况。

如何使用 props 将组件和路由解耦

props 被设置为 trueroute.params 将会被设置为组件属性。

路由配置:

{ path: '/user/:id', component: User, props: true },

组件:

const User = {
  props: ['id'],
  template: '<div>User {{ id }}</div>'
}

嵌套路由

子路由嵌套

// src/router/index.js

const router = new VueRouter({
  routes: [
    { 
        path: '/user/:id',
        component: User,
        children: [
             {
                // 当 /user/:id/profile 匹配成功,
                // UserProfile 会被渲染在 User 的 <router-view> 中
                path: 'profile',
                component: UserProfile //子组件UserProfile显示在父组件User里的<router-view>
            },
            {
                // 当 /user/:id/posts 匹配成功
                // UserPosts 会被渲染在 User 的 <router-view> 中
                path: 'posts',
                component: UserPosts//子组件UserPosts显示在父组件User里的<router-view>
            }
        ]
    }
  ]
})

lizi

//index.js
import Myshoucang from '@/components/Myshoucang'
import Shangpinshoucang from '@/components/shoucang/Shangpinshoucang'
import Dianpushoucang from '@/components/shoucang/Dianpushoucang'


 {
            //收藏
            path: '/Myshoucang',
            name: 'Myshoucang',
            component: Myshoucang,
            children: [{
                    path: '/Shangpinshoucang',
                    component: Shangpinshoucang
                },
                {
                    path: '/Dianpushoucang',
                    component: Dianpushoucang
                }
            ]

},
        
        

  //Myshoucang.vue  
<script>
export default {
  name:'hmyid',
  methods:{
    shangpinshoucang(){
      this.$router.push("/Shangpinshoucang");
    },
      dianpushoucang(){
      this.$router.push("/Dianpushoucang");
    },
  }
};
</script>    
        

后台管理系统里,经常要使用子路由嵌套

路由模式

路由模式分为两种:hash和history。

区别(面试题):
1)、外观上
  • hash模式时,路径上有#。
  • history模式时,路径上没有#
2)、hash模式不会给后端发请求

history模式会给后端发请求,需要后端配合。要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。否则,就会返回404。如果后端有同名的url,那么就会找后端的url。

// src/router/index.js

let router = new VueRouter({ //插件路由对象
  routes,
  // mode:'hash'//哈希模式   location.href
  mode:'history'//历史记录   history.pushState
});
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容