1.简单介绍
- Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。
- vue是一个典型的单页面应用
- 只有一个入口页面index.html
- 页面中内容全部是由组件来构成
- 如果想要实现 a列表组件跳转b详情组件 我们就不能使用传统的a标签来实现 你需要使用vue-router vue路由
- 路由可以简单地认为就是之前html里边的a链接
5.组件分为:
普通组件和路由组建
普通组件需要注册
路由组件不需要注册可以直接使用
2.创建路由
- 定义路由组件
const child1={template: `<div class="child1">child1</div>`}const child2={template: `<div class="child2">child2</div>`}
定义路由
const routes=[{path: '/child1',component: child1},{path: '/child2',component: child2}]
3 创建 router 实例,然后传
routes配置const router=new VueRouter({// routes: routesroutes //ES6语法 属性名和属性值一致时 可以缩写为一个})
4 创建和挂载根实例
new Vue({el: '#app',data: {},router: router})
<div id="app"><!-- 相当于html中a标签 to相当于href属性 --><router-link to="/child1">页面1</router-link><router-link to="/child2">页面2</router-link><!-- 路由匹配到的组件将渲染在这里 --><router-view></router-view></div>
3.动态路由
1.动态路由是指把某种模式匹配到的所有路由,全部映射到同一个组件。
例如有一个user组件,对于所有id各不相同的用户,都需要使用这个组件来渲染,可以使用动态路由
2.使用方法
const user={template:`<div>user</div>`const router=new VueRouter({routers:[{path:'/user/:自定义名字',component:user}]})此时/user/foo和/user/bar将映射到相同的路由
3.获取路径参数
$route.params 路由地址/参数值
$route.query 路由地址/?参数名=参数值
4.响应路由参数的变化
当使用路由参数时,原来的组件实例会被复用,因为两个路由都渲染同一个组件,那么组建的生命周期钩子函数不会再被调用,那么复用组件时,可以使用watch监听$route对象的变化来做出响应
const user={template:`...`,watch:{$route(to,from){//对路由变化做出响应}}}
4.嵌套路由
一个路由组件包含另一个路由组件,即由多层嵌套的组件组合而成
<div id="app"><router-view></router-view> 渲染最高级路由匹配到的组件(user)</div><script>const user={template:`<div class="user"><router-view></router-view> 渲染匹配children中所对应的组件</div>`}const child={template:`<div class="child">child</div>`}const router=new VueRouter({routes:[{path:'/user',component:user,children:[{path:'child', 地址为user/child时渲染在user组件中component:child}]}]})</script>
5.编程式的导航 router.push/router.replace/router.go
一 router.push
1.使用router.push方法可以导航到不同的URL,该方法会向history栈添加一个新的记录,当用户点击浏览器后退按钮时,会回到之前的URL,点击
2.该方法的参数可以是字符串路径或描述地址的对象
- router.push(‘home’) 字符串
- router.push({path:’home’}) 对象
- router.push({name:’user’,params:{userid:’123’}}) 命名路由 /user/123
- router.push({path:’register’,query:{plan:’private’}}) 带查询参数 /register?plan=private
注意:若提供path,params会被忽略,此时需提供路由的name或手写完整的带有参数的path
router.push({path:'/user',params:{user}}) 这里的params不生效正确写法:const userId='123'router.push({name:'user',params:{userId}}) /user/123router.push({path:'/user/${userId}'}) /user/123
二 router.replace
router.replace 类似于router.push
不同的是,它不会向history添加新纪录,而是替换掉当前的history记录
该方法浏览器不能使用前进和后退操作
三 router.go(n)
该方法参数为整数,可以在history记录中向前或向后退多少步
类似于window.history.go(n)
router.go(1)在浏览器记录中前进一步
router.go(0)刷新页面
router.go(-1)在浏览器记录中后退一步
6.命名路由
1.通过一个名称来标识路由,方便在路由使用的时候快速匹配
2.在创建Router实例时,在routes配置中给路由设置名称
routes:[{path:'/user/:userId',name:'users',component:user}]<router-link :to="{name:'users',params:{userId:123}}>user</router-link>//to属性为对象,链接到另一个路由
7.命名视图
1.给不同的router-view定义不同的名字,通过名字进行对应组件的渲染,它可以实现同时展示多个视图(不是嵌套展示),也就是可以在界面中拥有多个单独命名的视图,若router-view没设置名字,默认为default
<router-view></router-view> //默认名字 default<router-view name="a"></router-view><router-view name="b"></router-view>const routes=[{path:'/',components:{ /一个视图使用一个组件渲染,对于同个路由,多个视图就需要多个组件,因此使用componentsdefault:Foo,a:Bar,b:Baz}}]
8.重定向
1.路由重定向就是在输入path路径的时候,重新定义了路由的跳转
2.重定向是通过routes配置中的redirect属性来完成的
3.例如,从路径/a重定向到/b (访问/a url被替换为/b)
routes:[在a的routes中配置{path:'/a',redirect:'/b'}当路由地址为/a时会强制跳转到/b*{path:'/a',redirect:{name:'foo'}}*{path:'/a',redirect:to=>{return 重定向的字符串路径/路径对象}}]
9.别名
1.在url中输入/a或者是/b(为/a的别名),都指向与同一个路由组件来进行渲染
2.别名是通过routes配置中的alias属性来完成的
3.例如
路径/a的别名为/broutes:[{path:'/a',alias:'/b',component:A}]
别名的功能可以自由地将UI结构映射到任意的URL,而不是受限于配置的嵌套路由结构
