Vue全家桶-前端路由

Vue全家桶-前端路由

一、路由的基本概念与原理

1.路由:是一个比较广义和抽象的概念,路由的本质就是对应关系。

开发中,分为后端路由和前端路由。

①后端路由:根据不同的用户URL请求,返回不同的内容。

本质:URL请求地址与服务器资源之间的对应关系。

②SPA

后端路由渲染(存在性能问题)。

Ajax前端渲染(前端渲染提高性能,但是不支持浏览器的前进后退操作)。

SPA单页面应用程序:整个网站只有一个页面,内容的变化通过Ajax局部更新实现,同时支持浏览器地址栏的前进的后退操作。

SPA实现原理之一:基于URL地址的hash(hash的变化会导致浏览器记录访问历史的变化、hash的变化不会触发新的URL请求)。

在实现SPA过程中,最核心的技术点就是前端路由。

③前端路由:根据不同的用户事件,显示不同的页面内容。

本质:用户事件与事件处理函数之间的对应关系。

④实现简易前端路由

基于URL中的hash实现(点击菜单的时候改变URL的hash,根据hash的变化控制组件的切换)

//监听window的onhashchange事件,根据获取得到的最新hash值,切换要显示的组件的名称

window.onhashchange = function () {

    //通过location.hash 获取到最新的hash值

}

2.Vue Router

Vue Router 是vue.js官方的路由管理器。

它和vue.js的核心深度集成,可以非常方便的用于SPA应用程序的开发。

vue Router 包含功能有:

支持HTML5历史模式或hash模式

支持嵌套路由

支持路由参数

支持编程式路由

支持命名路由

二、vue-router的基本使用

1.基本使用步骤

①引入相关库文件

导入vue文件,为全局window对象vue构造函数

<script src="./lib/vue_2.5.22.js"></script>

导入vue-router文件,为全局window对象挂载VueRouter构造函数

<script src="./lib/vue-router_3.0.2.js"></script>

②添加路由链接

router-link是vue中提供的标签,默认会被渲染为a标签

to属性默认会被渲染成href属性

to属性的默认值会被渲染成#开头的hash地址

<router-link to="/user">User</router-link>

<router-link to="/register">Register</router-link>

③添加路由填充位

路由填充位,也叫路由占位符

将来通过路由规则匹配到的组件,将会被渲染到router-view所在的位置

<router-view></router-view>

④定义路由组件

var User = {

    template: '<div>User</div>'

}

var Register = {

    template: '<div>Register</div>'

}

⑤配置路由规则并创建路由实例

//创建路由实例对象

var Router = new VueRouter({

    //routes是路由规则数组

    routes:[

      //每个路由规则都是一个配置对象,其中至少包含path和component 两个属性:

    //  path表示当前路由规则匹配的 hash地址

    // component表示当前路由规则对应要展示的组件

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

      {path:'/register',component:Register}

    ]

})

⑥把路由挂载到Vue根实例中

new Vue({

    el: '#app',

    router

});

2.路由重定向

指的是用户在访问地址A的时候,强制用户跳转到地址C,从而展示特定的组件页面,通过路由规则的 redirect属性,指定一个新的路由地址,可以很方便的设置路由的重定向:

var router = new VueRouter({

    routes:[

      //其中path表示需要被重定向的原地址,redirect表示将要被重定向到的新地址

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

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

        {path:'/register',component:Register}

    ]

})

三、vue-router嵌套路由

1.嵌套路由用法

①嵌套路由功能分析

点击父级路由链接显示模板内容

模板内容中又有子级路由链接

点击子级路由链接显示子集模板内容

②父路由组件模板

父级路由链接

父组件路由填充位

<p>

    <router-link to="/user">User<router-link>

    <router-link to="register">Register<router-link>

</p>

<div>

    控制组件的显示位置

    <routet-view><router-view>

</div>

③子级路由模板

子级路由链接

子集路由填充位

const Register = {

    template : `<div>

        <h1>Register 组件</h1>

        <hr/>

        <routet-link to="/register/tab1">Tab1</routet-link>

          <routet-link to="/register/tab2">Tab2</routet-link>

        子路由填充位置

        <router-view/>

    </div>`

}

④嵌套路由配置

父级路由通过children属性配置子集路由

const router = new VueRouter({

    routes:[

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

      {

        path:'/register',

        component: Register,

        //通过children属性,为/register添加子路由规则

        children : [

          {path:'/register/tab1',component:Tab1},

          {path:'/register/tab2',component:Tab2}

        ]

      }

    ]

})

四、vue-router动态路由匹配

1.动态匹配路由的基本用法

思考:

有如下三个路由链接

<router-link to="/user1">User1<router-link>

<router-link to="/user2">User2<router-link>

<router-link to="/user3">User3<router-link>

//定义如下三个对应的路由规则,是否可行?

  {path:'/user1',component:User}

  {path:'/user2',component:User}

  {path:'/user3',component:User}

应用场景:通过动态路由参数的模式进行路由匹配

var router = new VueRouter({

    routes: [

      //动态路径参数,以冒号开头

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

    ]

})

const User = {

    //路由组件中通过$router.params获取路由参数

    template : '<div>User  {{ $router.params.id}}</div>

}

2.路由组件传递参数

$routet与对应路由形成高度耦合,不够灵活,所以可以使用props将组件和路由解耦。

①props的值是布尔类型

const router = new VueRouter({

    routes : [

      //如果props被设置为true,routet.params将会设置为组件属性

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

    ]

})

const User = {

    props:['id'],//使用props接收路由参数

    template : '<div>用户ID:  {{ id }}</div>' //使用路由参数

}

②props的值为对象类型

const router = new VueRouter({

    routes : [

      //如果props是一个对象,它会被按原样设置为组件属性

        {path:'/user/:id', component : User, props:{ uname:'li',age:20}}

    ]

})

const User = {

    props:['uname','age:],

    template : `<div>用户信息:  {{ uname +'---'+ age }}</div>`

}

③props的值为函数类型

const router = new VueRouter({

    routes : [

      //如果props是一个函数,则这个函数接收router对象为自己的形参

        {path:'/user/:id',

          component : User,

          props: router => ({ uname:'zs', age: 20, id : router.params.id})}

    ]

})

const User = {

    props:['uname' 'age','id'],

    template : `<div>用户信息:  {{ uname +'---'+ age + '---' + id}}</div>`

}

五、vue-router命名路由

1.命名路由的配置规则

为了更加方便的表示路由的路径,可以给路由规则起一个别名,即为'命名路由'。

const router = new VueRouter({

    routes : [

        {path:'/user/:id',

          name: :'user'

          component : User

        }

    ]

})

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

routet.push({ name:'user', params : { id :123}})

六、vue-router编程式导航

1.页面导航的两种方式

声明式导航:通过点击链接实现导航的方式。

例如:普通网页中的a链接,或者vue中的router-link标签

编程式导航:通过调用JavaScript形式的Api实现导航的方式

例如:普通网页中的location.href

编程式导航基本用法:

常用的编程式导航API如下

this.$router.push('hash地址')

this.$router.go(n)

const User ={

    template : '<div><button @click="goRegistet">跳转到注册页面</button></div>

    methods : {

        goRegister : function () {

          //用编程的方式控制路由跳转

          this.$router.push('/register');

        }

    }

}

2.编程式导航参数规则

router.push()方法的参数规则

//字符串(路径名称)

router.push('/home')

//对象

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

//命名的路由(传递参数)

router.push({ name : '/user', params : { userId : 123}})

//带查询参数,变成/register?uname=lisi

router.push({ path : '/register', query : { uname : 'lisi'}})

七、基于vue-routet的案例

后台管理路由案例

用到的路由技术要点:

路由的基本用法,

嵌套路由,

路由重定向,

路由传参,

编程式导航

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