# 如何使用脚手架搭建一套带路由的模板
1 | 1. 使用 |
# 路由的概念
开发单页面使用需要路由,路由控制的就是 url 中的 hash 部分(即锚点部分,代表当前页面的对应部分),当 url 的 hash 部分改变后,则会载入对应的组件,从而显示该组件内容。
路由是指根据 url 分配到对应的处理程序。
vue-router(vue 的路由管理器):
作用:通过管理 url,实现 url 和组件的对应和通过 url 进行组件的切换。即通过路由管理器实现 url 与 vue 组件的映射,访问特定的 url 就可以访问对应的 vue 组件。
通过路由,让单页面开发易如反掌。
单页面应用的好处:就如同tab切换页一样,第一次加载进来的资源会保存到本地,等加载其他组件时,在加载其他页面或组件时,不需要重新下载已经加载了的静态资源。特别是在手机端,用得很广泛。
一个 url 对应一个组件
一个 url 希望对应一个组件,比如:
http://localhost:8080/#/ —>home.uve
http://localhost:8080/#/about —>about.vue
http://localhost:8080/#/contact —>contact.vue
路由好比是一个 tab 切换页,上面是导航,下面是面板,面板对应的是组件。
通过路由来管理 url 是如何对应显示一个组件。
hash 模式 vue 的路由是通过控制 url 的 hash 部分来控制组件的,hash 部分改变了,会显示对应组件
# 路由需要的配置(如何写)
-
写 a 链接(使用 router-link 代替)指定 url 地址
-
写 router-view,告诉路由匹配到的组件渲染到什么位置
1
2
3
4<router-view></router-view>
该标签中可以添加class名字,这样会带入到渲染进来的那个组件的根元素的class中,会与原来的className合并。
比如:
<router-view class="tc"></router-view> -
写 router.js 配置这种关系,并将 router.js 导入到 main.js 中使用
参考 router.js
将 router.js 导入到 main.js 并在 vue 的实例中注册
1
2
3
4
5new Vue({
el: '#app',
//这个也是Vue的一个葫芦娃兄弟
router
});
# 配置 router 对象
可以将默认的 hash 模式改为 history 模式
1 | var router = new Router({ |
# ronter-link 的配置
1、to="/home" 表示目标路由的链接
可以改为动态绑定 :to=“home” home 来自组件的 data 数据,比如 home:"/home"
也可以改为对象的方式 :to="{path:’/home’}"
2、tag=“li” 指定渲染的标签,会监听导点击,触发导航,用来代替 a 链接,里面还可以放一个没有 href 的 a 链接,这样除标签外还会生成一个 a 链接
3、active-class=“cur” 设置 链接激活时使用的 CSS 类名(只作用于当前链接会生效,如果要全局生效,需要写在路由对象的 routes 属性中,即 linkActiveClass:“自定义高亮 class”)
4、exact 开启 vue 严格匹配路由模式,不开启默认是全包含匹配模式,这样当是路由嵌套时,父级会一只高亮,添加该属性则不会
5、event=“click|mouseover” 更改默认触发链接的行为,默认是点击跳转,可以改为鼠标移入触发
# router.js 的配置
# 历史模式
1 | mode:"history",//默认是hash模式,即锚点模式 |
# 命名路由
1 | { |
# 嵌套路由
步骤:
- 在对应的要显示组件和链接的父组件中使用 router-link 和 router-view,如果要嵌套子组件,需要使用 children 配置,并且依然要在嵌套的组件中添加 router-link 和 router-view
- 在路由配置里使用 children 属性,值为数组,里面同父级写法,同时需要将该组件引入进来
1 | { |
# 重定向和别名
-
重定向
用户访问到一个错误地址时,自动跳转或定位到 404 页面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21{
//给其设置重定向(404)页面 *表示匹配所有的路径,除上面配置好的
path:"*",
component:notfound,
//或使用重定向的4种用法
// redirect:"/home"
// redirect:{path:"/home"},
// redirect:{name:"home"},
//函数的方式,就是动态重定向了,可以通过if语句根据不同的path切换到不同的页面
redirect:(to)=>{
console.log(to);
if(to.path=="/abc"){
return '/home'
}else if(to.path=='/123'){
return {path:'/document'}
}else{
return {name:'About'}
}
//return '/home'
}
} -
别名
希望实现一个组件对应多个 url。
比如
http://localhost:8080/homehttp://localhost:8080/index
都对应同一个 home 组件
1
2
3
4
5
6
7{
path:"/home",
name:"Home",
component:home,
//给/home添加别名,这样访问 /index就相当于是访问/home组件,但要注意高亮问题,这时通过别名访问就不高亮了
alias:'/index'
},
# 命名视图
原来是多个 url 对应一个组件,可以用别名。
一个 url 对应多个组件,即一个 url 匹配显示多个组件。就需要用命名视图。
步骤:
-
在默认的 router-view 中再新建一个 router-view, 并起一个名字
1
2
3
4<router-view class="min-h-100"></router-view>
<!-- 假设要显示再显示一个组件,就需要再写一个roter-view -->
<!-- 即给该视图使用name命名 -->
<router-view name="sidebar" class="sidebar"></router-view> -
在 router.js 中,对应的 url 配置路由中,比如要让 http://localhost:8080 / 显示 home 和 sidebar 组件,就需要在 path:’/' 中将 component 改为 components,写成对象的方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14{
// path表示url的访问路径
// component表示url对应的那个组件
path:'/',
// 命名路由:
// 用法:1、可以代替path
// 2、在重定向时,直接使用name更方便
name:'home',
// component:Home,//命名视图配置:原来是一个url显示到一个router-veiw中,现在想一个url对应显示两个组件
components:{
default:Home,
sidebar:sidebar
}
},
# router-view 的配置
-
命名视图
1
2
3
4//默认视图
<router-view></router-view>
<!-- 即给该视图命名 -->
<router-view name="sidebar" ></router-view> -
在 router-view 中写 class,会将该 class 合并到对应的组件的 class 中
1
<router-view class='tc'></router-view>