Vue中的路由 Router

Vue中的路由 Router

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。

单页应用SPA

所谓单页应用,指的是在一个页面上集成多种功能,甚至整个系统就只有一个页面,所有的业务功能都是它的子模块,通过特定的方式挂接到主界面上。它是AJAX技术的进一步升华,把AJAX的无刷新机制发挥到极致,因此能造就与桌面程序媲美的流畅用户体

单页应用SPA 实现

页面切换:浏览器地址栏哈希值控制隐藏显示div

页面加载:通过ajax动态获取

路由视图结构

存放页面 <router-view>

切换路由 <router-link>

路由配置

{
    path: '/about',  // 路由连接地址 和router-link to值对应
    name: 'Home', // 路由的名称 
    component: Home 
    // 路由页面使用的组件被填充的router-view里面的组件              
},

路由参数配置

  1. 动态路径参数

    // 配置
    {
    path:“/produce/:id”
    name:"produce"
    component:Produce
    }
    // 跳转链接
    <router-link to="/produce/123">Go</router-link>
    /*
    :id就是给路由配置的参数
    当匹配到一个路由时,参数值会被设置到 this.route.params 使用route.params.id获取参数
    */

  2. 查询字符串参数

    <router-link to="/produce?id=123">Go</router-link>

router和route区别

  1. $route
    • Object类型对象
    • 内部有params 第一种路由传参 /detail/:id /detail/101 this.$route.params.id
    • query 路由传参 第二种 ?redirect=carts this.$route.query.redirect
    • path 路由路径
    • meta 路由携带数据 { meta:{ auth:true,name:aiva } }
  2. $router 一个VUE的路由对象
    • this.$router.push(“目标路由”)
    • this.$router.go(-1) 回退

路由导航

  • router.push
    push方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL
    该方法的参数可以是一个字符串路径,或者一个描述地址的对象

    // 字符串
    router.push('home')

    // 对象
    router.push({ path: 'home' })

    // 命名的路由
    router.push({ name: 'user', params: { userId: '123' }})

    // 带查询参数,变成 /register?plan=private
    router.push({ path: 'register', query: { plan: 'private' }})

  • router.replace
    router.replace跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。

    this.$router.replace("home")

  • router.go
    这个方法的参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n)。

      this.$router.go(1)  // 前进1步
      this.$router.go(-1) // 后退1步
    

跳转

<router-link to=/home">首页</router-link> 
<router-link :to="{ path: 'home' }">Home</router-link> 
<router-link :to="{ name: 'produce', params: { id: 123 }}">
产品123
</router-link>

重定向

{ path: '/home', redirect: '/' }

别名

    { path: '/a', component: A, alias: '/b' }

404

{path: '*'// 会匹配所有路径}

路由高亮

.router-link-active

全局配置 <router-link> 默认的激活的 class

.router-link-exact-active

全局配置当链接被精确匹配的时候应该激活的 class

路由嵌套

路由可以嵌套,一个被渲染路由组件同样可以包含自己的嵌套 <router-view>

  • 要在嵌套的出口中渲染组件,需要在 VueRouter 的参数中使用 children 配置

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

要注意,以 / 开头的嵌套路径会被当作根路径。嵌套的路由不需要使用'/'

路由权限控制

beforeEach() 全局前置守卫 进入前调用

afterEach() 全局后置钩子 进入后调用

每个守卫 三个参数:

  • to: Route: 即将要进入的目标 路由对象
  • from: Route: 当前导航正要离开的路由
  • next: 一定要调用该方法来路由才会切换。
  • next() 直接进入下个路由
  • next(false) 路由回到from页面
  • next('/') 路由跳转到首页

路由元信息

给路由配置额外的信息

{ path:"/cart",
    ...    
    meta:{requireAuth:true}
}
// $route.meta.requireAuth 获取

组件内部守卫

  • beforeRouteEnter 进入前 (没有this)

  • beforeRouteUpdate 参数更新是

  • beforeRouteLeave 路由离开前

    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
    }
    }

路由过渡

<transition>
  <router-view></router-view>
</transition>

组件缓存

<keep-alive>
  <router-view  v-if="$route.meta.keep" />
</keep-alive>
  <router-view v-if="!$route.meta.keep" />

路由懒加载

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

推荐阅读更多精彩内容