一.路由的概述。vue
vue-router是vue.js官方的路由插件,它和vue.js是深度集成的,适用于构建单页面。vue的单页面应用是基于路由和组件的,路由是用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超连接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换
vue-router
二。路由的使用编程
1.使用router-link标签进行导航, to属性表示指定的连接,router-link标签会被渲染成a标签。路由匹配到的组件在router-view中渲染出来,即这是路由的出口。api
"router-link"属性:数组
1>":to" 属 性.至关于a标签中的"herf"属性,后面跟跳转连接所用浏览器
2>"replace" 属 性 replace在routre-link标签中添加后,页面切换时不会留下历史记录app
<router-link :to="/home" replace></router-link>
3>"tag" 属 性 具备tag属性的router-link会被渲染成相应的标签异步
<router-link :to="/home" tag="li">Home</router-link> <!-- 渲染结果 --> <li>Home</li>
4>"active-class" 属 性 这个属性是设置激活连接时class属性,也就是当前页面全部与当前地址所匹配的的连接都会被添加class属性。函数
<router-link :to="/home" active-class="u-link--Active">Home</router-link>
5>"exact" 属 性 开启router-link
的严格模式ui
<router-link :to="/" exact>home</router-link>
HTML:
<router-link to="/one">路由</router-link>
<router-view></router-view>
router.js:
定义路由:
main.js: 在main.js中须要经过router配置参数注入路由
2.什么是动态路由?
1.<router-link :to="{name: 'dynamicOne', params: {id:222, name: 'gmn'}}">动态路由传参形式1</router-link>
2.<router-link :to="{path:'dynamicTwo/567', query: {name: 'gmn'}}">动态路由传递多个参数, 经过query传递参数</router-link>
3.<router-link :to="{name: 'dynamicOne', params: {id:222,name:'gmn'}, query: {age: 18}}">动态路由params和query组合传参的</router-link>
4.<router-link :to="{path:'/dynamicTwo/567?a=1'}">在path中添加?表示,传递的参数</router-link>
对应的定义路由的形式:
{ path: '/dynamicOne/:id/:name', name: 'dynamicOne', component: dynamicOne }, { path: '/dynamicTwo/:uid?', //“?” name: 'dynamicTwo', component: dynamicTwo },
params和query在路由的跳转上,均可以用来传递参数,那么。params和query的区别的区别是什么呢?
params和query的区别:
1》两者的认识
params: /router1/:id,/router1/123这里的id叫作params
query: /router1?id=123, 这里的id叫作query
2》 传参
params传参,要在路由的后面加上参数名,而且在传参的时候,参数名要跟路由后面设置的参数名对应。
query传参,则没有这个限制,直接在跳转里面传递参数就行,不须要在路由的后面加上对应的参数。
params是路由的一部分,必需要有。query是拼接在url后面的参数,没有也不要紧。
3》地址栏中的区别
params传参在地址栏中不显示,query传参在地址栏中可见的。
params:
query:
知识点:::
若是路由上面不写参数,也能够传递过去,可是不会在url上显示你的参数,而且在跳转别的页面或者刷新的时候,参数就会丢失。打印结果以下::
未刷新前:
刷新后:丢失name
3.嵌套路由(又称为子路由)
就是咱们在原路由的基础上增长一个children,children是一个数组,而且咱们还须要在原来的组件上添加<router-view>来渲染children里面的路由。
以“/”开头的嵌套路径会被看成根路径,因此子路由上不用加“/”;
在生成路由时,主路由上的path会被自动添加到子路由以前,因此子路由上的path不用在从新声明主路由上的path了。
// 嵌套路由 { path: '/father', name: 'father', component: father, children: [{ path: '/father/children', component: children }, { path: '/father/childrenTwo', component: childrenTwo }] },
4.编程式导航
在前面介绍经过router-link标签来进行导航,还有一种方式进行导航,便是编程式导航。
即经过router实例的方法,进行编写。router.push('/a');
1>router.push 此方法将新条目推送到历史堆栈中,点击浏览器中回退安钮时,就会回退到以前的URL;
2>router.replace此方法替换了当前的URL,与router.push的区别就是它导航而不推送到新的历史条目。
3>router.go(n)此方法采用单个整数做为参数,指示在历史堆栈中前进或后退的步数。整数表示前进,负数表示后退
// 编程式路由 route.push('/one') // 编程式路由传参params route.push({name: 'dynamicOne', params: {id:111}}) // 编程式路由传参query route.push({name: 'dynamicTwo', params: {uid:'3333'}, query: {name:'gmn'}})
5.命名路由
给路由定义不一样的名字,根据名字进行匹配。给不一样的router-view定义名字,router-link经过名字进行对应组件的渲染。经过“name”表示路由的名字。
<router-link :to="{name: 'dynamicOne', params: {id:222,name:'gmn'}}">动态路由传参params</router-link> { path: '/dynamicOne/:id/:name', name: 'dynamicOne', //命名路由 component: dynamicOne },
6.命名视图
给不一样的router-view
定义不一样的名字,经过名字进行对应组件的渲染。意义在于在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。若是router-view灭有设置名字,那么默认为default。
<router-view/> <router-view name="view"></router-view> <router-view name="viewTwo"></router-view> // 同级视图 { path: '/view', components: { default: one, view: view, viewTwo: viewTwo } },
7.重定向和别名
重定向的意思是:从新定义路由的跳转,好比,默认是跳转到 ‘/a’,重定向到 ‘ /b’,意思就是 跳转到a 的时候 直接跳转到b。
重定向的目标能够是一个命名的路由。也能够是 动态返回重定向目标。
<router-link :to="{name:'/two', params: {id: '111'}}"> 重定向传参 </router-link> // 重定向,别名 { path: '/two', // redirect: '/father', // redirect: {name: 'father'}, // name // redirect: '/dynamicOne/:id', //传参 redirect: to => { return '/father' //动态重定向 }, name: '/two', component: two, }
别名:就是 至关于 给路由起的 小名儿,
“别名”的功能让你能够自由地将 UI 结构映射到任意的 URL,而不是受限于配置的嵌套由。用alias属性表示
<router-link to="/na">别名</router-link> { path: '/two', component: two, alias: '/na' }
8.History模式
vue-router默认Hash模式,使用URL的hash来模拟一个完整的URL,URL改变,页面不会从新加载。可是正常状况下来讲,当url改变,页面是必定会更换的。只有更换url中的查询字符串和hash值得时候才不会从新加载页面。例如
可是这种#形式不美丽,也为了解决 更改地址后页面从新渲染的页面的问题,全部就有了history模式的出现,
改变后的路径:就看着 很美丽了。
可是
这种模式须要后台配置的支持。由于咱们的应用是个单页客户端应用,若是后台没有正确的配置,当用户在浏览器直接访问 http://oursite.com/user/id
就会返回 404,这就很差看了。
9.路由元: meta字段。用来携带一些隐藏信息,好比判断是否登陆
{ path: '/one', name: 'one', component: one, meta: {require: true} }
使用,在one.vue中this.$route中查到这个字段,具体以下:
10.路由懒加载:
什么是懒加载呢?懒加载也叫作延迟加载,即在须要的时候进行加载,随用随载。
为何须要懒加载呢?当打包构建应用时,Javascript 包会变得很是大,影响页面加载。若是咱们能把不一样路由对应的组件分割成不一样的代码块,而后当路由被访问的时候才加载对应组件,这样就更加高效了。
结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载。
const one = () => import('@/components/One') { path: '/one', name: 'one', component: one, meta: {require: true} },
11.路由的生命周期
全局守卫: 1.router.beforeEach:全局前置守卫,进入路由以前。2,。router.beforeResolve:全局解析守卫,在beforeRouterEnter调用以后调用。3.router.afterEach 全局后置钩子 进入路由以后
1>全局前置守卫::::::当一个导航触发时,全局前置守卫按照建立顺序调用。守卫是异步解析执行,此时导航在全部守卫 resolve 完以前一直处于 等待中。
有三个参数:
next(false)
: 中断当前的导航。若是浏览器的 URL 改变了 (多是用户手动或者浏览器后退按钮),那么 URL 地址会重置到
from
路由对应的地址。
next('/')
或者
next({ path: '/' })
: 跳转到一个不一样的地址。当前的导航被中断,而后进行一个新的导航。
next
方法,不然钩子就不会被 resolved。
const router = new VueRouter({ ... }) router.beforeEach((to, from, next) => { if(to.name == "one"){ next(); } else if(to.path != "/"){ next("/"); } else{ next(); } })
2>全局解析守卫:::: 和router.beforeEach()相似,区别是在导航被确认以前,同时在全部组件内守卫和异步路由组件被解析以后,解析守卫就被调用。
3>全局后置钩子:这个没有next函数
router.afterEach((to, from) => { // ... })
4>路由独享的守卫 :就是在路由配置上直接定义beforeEnter守卫
const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, beforeEnter: (to, from, next) => { // ... } } ] })
5.组件内的守卫: 在路由组件中直接定义如下路由导航守卫。
beforeRouteEnter: 在渲染该组件的对应路由被confirm前调用, 不能获取组件实例this,由于当守卫执行前,组件实例还没被建立。
beforeRouteUpdate
:在当路由改变,可是该组件被复用时调用,好比在动态路由中,在one/1, one/2之间转换的时候,因为会渲染一样的one组件,所以,组件实例会被复用,而这个钩子就会在这种状况下调用,能够访问this
beforeRouteLeave:导航离开该组件对应的路由时调用,能够访问this。
6.整个路由守卫被触发流程的步骤:
beforeEach
守卫。beforeRouteUpdate
守卫 。beforeEnter
。beforeRouteEnter
。beforeResolve
守卫 (2.5+)。afterEach
钩子。beforeRouteEnter
守卫中传给 next
的回调函数。
·