什么是路由

之前有个小伙伴面试被问到:
面试官:不用vue能不能写单页面应用?
答:用angular啊(咳咳,开个玩笑),答案确实是可以的,原生js中有个事件叫做onhashchange,可以在window对象上监听这个事件,通过触发事件动态加载js,实现了没有向服务器发起请求却能通过url和页面关联,这就是所谓的前端路由了。
路由反映了url和页面的映射关系

vue路由

言归正传,说说vue-router做路由。
先来个简单的demo:
npm i vue-router --save-dev
先通过js手动引入vue-router

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import Vue from 'vue'
import Router from './router5.js' // router.js中代码
import Vue from 'vue'
import VueRouter from 'vue-router' Vue.use(VueRouter) const home = {
template:`
<div>
<h1>首页路由</h1>
</div>
`
}
const details = {
template:`<h1>详情路由</h1>`
} const router = new VueRouter({
mode: 'history',
base: __dirname,
routes: [
{
path: '/',
component: home
},
{
path: '/details',
component:details
}
]
}) new Vue({
router:router,
template:`
<div>
<router-link to="/">首页</router-link>
<router-link to="/details">详情</router-link>
<router-view></router-view>
</div>
`
}).$mount('#app');

大体步骤:1.引入 ==> 2.定义路由组件 ==> 3.创建vue-router实例并配置 ==> 4.注入vue实例
1.引入
import vue和vue-router
Vue.use(VueRouter)

2.定义路由组件
前两步没什么说的

3.路由配置:主要三个内容mode,base,routes
mode主要有两种:

  • 第一种是hash模式,hash模式背后的原理就是前面提到的内置的onhashchange事件
  • 第二种是history模式,使用H5的window.history功能,使用URL的Hash来模拟一个完整的URL,可以自由修改path

扯远了,第二个base,

4.注入vue实例
这里注意一下经常有这种写法:new Vue({ router, template:<div></div>}),这里的router写法是ES6写法

嵌套路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<div id="app">
<router-link to="/animals">动物园</router-link>
<router-link to="/animals/lion">狮子</router-link>
<router-link to="/animals/cat">猫</router-link> <!--第一级路径对应的组件会应用到这里-->
<router-view></router-view>
</div>
<script>
var tempZoo = {
template:`<div>
这里是动物园<br>
<!--第二级路径对应的组件会应用到这里-->
<router-view></router-view>
</div>`
};
var tempLion = {
template:`<img src="lion.png">`
}
var tempCat = {
template:`<img src="cat.png">`
}
var myRouter = new VueRouter({
routes:[
大专栏  [VUE]关于路由哪些事儿an class="line"> {
path:"/animals",component:tempZoo,
//子层路由规则配置,不能配置默认跳转
children:[
//path地址不能以/开头
{path:"lion",component:tempLion},
{path:"cat",component:tempCat}
]
},
{path:"/*",redirect:"/animals"}
]
});
var main = new Vue({
el:"#app",
router:myRouter
});
</script>

样式控制(默认class)

当跳转到某个路由视图时,Vue会为对应的<router-link></router-link>自动添加class。在添加时按照如下规则:
如果路径 部分匹配 (当前url为/a/b/c,则路由中路径为/a,/a/b,/a/b/c的均为部分匹配),则添加class=”router-link-active”。 如果路径 绝对匹配 (当前url为/a/b/c,则路由中只有路径为/a/b/c的才为绝对匹配),则添加class=”router-link-exact-active”。
注意:绝对匹配也符合部分匹配的规则,因此当一个路由和当前url绝对匹配时,会被同时加入两种class。

样式控制(自定义class)

<router-link></router-link>自动添加的class也可以在创建路由对象时自定义。

1
2
3
4
5
6
7
8
9
var myRouter = new VueRouter({
routes:[
{},{}...
],
//部分匹配时class
linkActiveClass:"active",
//绝对匹配时class
linkExactActiveClass:"exact-active"
});

改变router-link的模板标签

<router-link></router-link>在页面上会默认形成<a></a>标签。我们可以通过向其转入属性来决定生成什么样的标签,这不影响其监听点击事件来进行路由跳转

1
2
3
4
5
<!--使用tag属性来指定形成的标签-->
<router-link to="/r1" tag="div">路由1</router-link> <!--在页面上的渲染结果:-->
<div>路由1</div>

路由传参(通过url)

路由配置:

1
2
3
4
5
6
var myRouter = new VueRouter({
routes:[
//用:参数名形式书写path
{path:"/r1/:name/:age",component:"template1"}
]
});

链接传参:

<router-link to="/r1/lins/24"></router-link>

路由传参(通过JS)

注意:当通过JS传递参数时,接受参数的路由刷新页面会导致参数失效。
路由配置:

1
2
3
4
5
6
var myRouter = new VueRouter({
routes:[
//使用name给路由起一个名字
{name:"rou1",path:"/r1",component:"template1"}
]
});

链接传参:

1
2
// 注意这里to前面的冒号
<router-link :to="{name:'rou1',params:{name:'lins',age:24}}"></router-link>

路由收参

组件模板(HTML部分)收参:

组件中JS部分收参(比如created中):
this.$route.params.name;
this.$route.params.age;

编程式导航(JS跳转路由)

1
2
3
4
5
6
7
8
9
10
11
//以下所有的的myRouter是使用new VueRouter()创建的对象
//不携带参数
myRouter.push("/r1");
//等价于
myRouter.push({path:"/r1"});
//通过url携带参数
myRouter.push("/r1/lins/24");
//等价于
myRouter.push({path:"/r1/lins/24"});
//通过JS携带参数
myRouter.push({name:'rou1',params:{name:'lins',age:24}});

vue-router常见的坑

1./router/:params1/:params2
这种路由传参,由于路由规则改变了,定义的子级路由会失效

2.{name:”rou1”,path:”/r1”,component:”template1”}
这种方式接受参数的路由刷新页面会导致参数失效。

[VUE]关于路由哪些事儿的更多相关文章

  1. vue(5)—— vue的路由插件—vue-router 常用属性方法

    前端路由 看到这里可能有朋友有疑惑了,前端也有路由吗?这些难道不应该是在后端部分操作的吗?确实是这样,但是现在前后端分离后,加上现在的前端框架的实用性,为的就是均衡前后端的工作量,所以在前端也有了路由 ...

  2. vue父路由默认选中第一个子路由,切换子路由让父路由高亮不会消失

    vue父路由默认选中第一个子路由,切换子路由让父路由高亮不会消失 正常默认会有 .router-active-class 识别高亮 达到以上注意: 1. exact 不要加 注意是不要加,exact ...

  3. vue的路由映射问题

    遇到的问题 今天在项目中遇到了一个问题,明明在Router文件夹下的路由js映射文件中,配置好了,如下: // 生日贺卡 { path: 'birthdayRemind', component: lo ...

  4. 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI

    一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...

  5. Vue.js路由

    有时候,我们在用vue的时候会有这样的需求,比如一个管理系统,点了左边的菜单栏,右边跳转到一个新的页面中,而且刷新的时候还会停留在原来打开的页面. 又或者,一个页面中几个不同的画面来回点击切换,这两种 ...

  6. Vue.js路由详解

    有时候,我们在用vue的时候会有这样的需求,比如一个管理系统,点了左边的菜单栏,右边跳转到一个新的页面中,而且刷新的时候还会停留在原来打开的页面. 又或者,一个页面中几个不同的画面来回点击切换,这两种 ...

  7. vue权限路由实现方式总结二

    之前已经写过一篇关于vue权限路由实现方式总结的文章,经过一段时间的踩坑和总结,下面说说目前我认为比较"完美"的一种方案:菜单与路由完全由后端提供. 菜单与路由完全由后端返回 这种 ...

  8. Vue 多路由文件的合并

    Vue 多路由文件的合并 1.使用的是ES6 数组的合并方法 let routes = new Set([...routes1, ...homerouters]);2.两个路由文件,导出的实际上就是一 ...

  9. vue+element-ui路由配置相关

    vue+element-ui路由配置相关 转自:http://www.cnblogs.com/MonaSong/p/6703804.html vue-router2中说明了,子路由前面可以不加'/', ...

随机推荐

  1. 关于Linux下Oracle安装后启动的问题

    1.首先,切换成oracle用户,启动监听服务.(中间的横杠必须加上,不然会出现command not found 的错误) 命令1:su  -  oralce 命令2:lsnrctl start 参 ...

  2. C语言 指针理解

    1.指针 指针全称是指针变量,其实质是C语言的一种变量.这种变量比较特殊,通常他的值会被赋值为某个变量的地址值(p = &a),然后我们可以使用 *p 这样的方式去间接访问p所指向的那个变量. ...

  3. 剑指offer【09】- 跳台阶

    题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 对于本题,前提只有 一次 1阶或者2阶的跳法. a.如果两种跳法,1阶或者 ...

  4. gMIS吉密斯十年执念:Lower Costs较低成本Better Productivity较高效率

    Hello 2020! 元旦快乐!今起揭开21世纪20年代的篇章. 1. gMIS吉密斯十周年 2010-2020,十年转眼已成历史,gMIS吉密斯——通用管理信息系统(general Managem ...

  5. day28-黏包现象

    #黏包现象:信息还没接收完,下一次接收的时候一下子接收好几条黏在一起的信息. #黏包现象的原因:接收端不知道发送端发送的数据的长度.recv(字节数小了). # 第一次无法接收完就缓存起来,下一次接收 ...

  6. 正则表达式sed学习(二)

    sedsed是一个流编辑器,非交互式的编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)接着用 sed 命令处理缓冲区的内容,处理完成 ...

  7. TCP\IP协议簇-各层主要协议帧格式

    本文只是对各协议的概要,详细请参考rfc文件. 官方下载地址:https://tools.ietf.org/rfc/index rfc中文:http://man.chinaunix.net/devel ...

  8. Eclipse 热部署方式

    1.tomcat 热部署 1.1方法一:更改 server.xml,更改为 <Context docBase="dreamlive" path="/ROOT&quo ...

  9. Windows下 webstorm安装tomcat配置svn并使用

    先附上所需要的软件的下载地址:https://pan.baidu.com/s/1c2ripd2 1.下载并安装jdk以及配置jdk的环境变量 1)下载jdk,选择安装目录安装,我选择的是默认路径,安装 ...

  10. python实现个人信息随机生成

    """ 生成随机姓名.电话号码.身份证号.性别.应行卡号.邮箱 """ import random from firstname impor ...