[toc]html
引言:该篇主要讲的是关于vue-router的原理以及使用等问题,以及面试中常被问到的几个点,有部分还未整理后续会继续更新;前端
Vue-router就是WebApp的连接路径管理系统。vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用
在以前经常使用的是用a标签进行跳转,如今作的是单页面应用,因此必须使用v-router进行管理vue
1. 下载webpack
cnpm i vue-router -S
2.在index.js中引入路由的核心模块web
import VueRouter from 'vue-router'
3.注册路由插件面试
Vue.use(VueRouter)
4.建立路由对象而且配置路径
这里有两种状况,一级路径 例如 "/film"能够以下写法便可,表示跳转/cinema页面渲染Cinema组件
注意:别忘了引入该组件vue-router
const routes = [ { path: '/cinema', component: Cinema } ]
嵌套路由: 这种状况下不会把cinema的组件内容覆盖 能够实现单组件切换内容 跟选项卡效果差很少 <img src='https://img2018.cnblogs.com/blog/1918240/202002/1918240-20200222204638866-1269180713.png' style='width:400px;height:400px'>npm
二级路径:"/film/nowplaying"浏览器
{ path: '/film', component: Film, children: [{ path: '/film/nowplaying', component: Nowplaying, }, { path: '/film/comingsong', component: Comingsong, } ] },
5.将路由对象传递给Vue实例服务器
const router = new VueRouter({ routes: routes }) export default router
6.配置好以后,须要在显示留坑,不然没法显示在页面上
<router-view></router-view>
完整代码写法以下:
//index.js文件中引入 // 路由的核心模块 import VueRouter from 'vue-router' import Cinema from '@/views/Cinema' // 必需要加 注册路由插件 Vue.use(VueRouter) // 路由映射表 const routes = [ { path: '/cinema', component: Cinema }, ] const router = new VueRouter({ routes: routes }) export default router
main.js
import router from './router' //new Vue 启动 new Vue({ el: '#app', //让vue知道咱们的路由规则 router: router, //能够简写router render: c => c(App), })
1.用name传递参数
在路由文件中配置name属性,组件中用 $router.name来接受
{ path: '/cinema', name:'cinema' component: Cinema } <!--获取--> <p>{{ $router.name}}</p>
2.经过 <router-link> 标签中的to传参
<!--须要在路由映射中提早配置好--> { path: '/cinema', component: Cinema } <router-link :to="{path:'/cinema',params:{key:value}}">666</router-link> <!--获取--> {{$route.params.key}}
3.经过url地址栏传参数
{ path: '/detail', component: Detail }, this.$router.push({path: '/detail', query: {data: datail}} <!--获取--> {{this.$route.query.data}}
SPA(single page application):单一页面应用程序,只有一个完整的页面;它在加载页面时,不会加载整个页面,而是只更新某个指定的容器中内容。 单页面应用(SPA)的核心之一是: 更新视图而不从新请求页面 ;vue-router在实现单页面前端路由时,提供了两种模式,根据mode参数来决定采用哪种方式
单页面应用:页面跳转是无刷新的,可是url 每次变化的时候,都会形成页面的刷新,因此为了解决经过hash来实现路由,在改变 url的状况下,保证页面的不刷新 url hash 相似于
http://www.xxx.com/#/film
这种 #。后面 hash 值的变化,并不会致使浏览器向服务器发出请求,浏览器不发出请求,也就不会刷新页面。另外每次 hash 值的变化,还会触发hashchange 这个事件,经过这个事件咱们就能够知道 hash 值发生了哪些变化。而后咱们即可以监听hashchange来实现更新页面部份内容的操做:
function matchAndUpdate () { // todo 匹配 hash 作 dom 更新操做 } window.addEventListener('hashchange', matchAndUpdate)
history 模式时,URL 就像正常的 url,只须要在配置路由规则时,加入"mode: 'history'",这种模式充分利用 history.pushState API 来完成 URL 跳转而无须从新加载页面
const router = new VueRouter({ mode: 'history', routes: [...] })
注意:还须要后台配置支持,若是没有正确配置会返回404;服务端增长一个覆盖全部状况的候选资源:若是 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。
解释:vue-router导航钩子 主要用来做用是拦截导航,让他完成跳转或取消
1. 全局导航钩子
全局导航钩子主要有两种钩子:前置守卫、后置钩子, 注册一个全局前置守卫:
const router = new VueRouter({ ... }); router.beforeEach((to, from, next) => { // do someting }); //to: Route,表明要进入的目标,它是一个路由对象 //from: Route,表明当前正要离开的路由,一样也是一个路由对象 //next: Function,这是一个必须须要调用的方法,而具体的执行效果则依赖 next 方法调用的参数
2. 路由独享的钩子
单个路由独享的导航钩子,它是在路由配置上直接进行定义的
cont router = new VueRouter({ routes: [ { path: '/file', component: File, beforeEnter: (to, from ,next) => { // do someting } } ] });
3. 组建内的导航钩子
组件内的导航钩子主要有这三种:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave。他们是直接在路由组件内部直接进行定义的
const File = { template: `<div>This is file</div>`, beforeRouteEnter(to, from, next) { // do someting // 在渲染该组件的对应路由被 confirm 前调用 }, beforeRouteUpdate(to, from, next) { // do someting // 在当前路由改变,可是依然渲染该组件是调用 }, beforeRouteLeave(to, from ,next) { // do someting // 导航离开该组件的对应路由时被调用 } }
$route :为当前router跳转对象里面能够获取name、path、query、params等
$router :为VueRouter实例,想要导航到不一样URL,则使用$router.push方法
返回上一个history也是使用$router.go方法 <img src='https://img2018.cnblogs.com/blog/1918240/202002/1918240-20200222204954826-172762562.png' style='width:400px;height:400px'>
例如从/user/foo导航到/user/bar,原来的组件实例会被复用。由于两个路由都渲染同个组件,比起销毁再建立,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用 路由参数的变化做出响应能够用如下方法:
1.watch监听,当路由发生变化的时候执行
watch:{ $route(to,from){ console.log(to.path); // 对路由变化做出响应... } },
2.在父组件的router-view上加个key
<router-view :key="$route.fullPath"></router-view>
const Foo = () => import('./Foo.vue') const router = new VueRouter({ routes: [ { path: '/foo', component: Foo } ] }) //有时候想把某个路由下的全部组件都打包在同一个异步快中,须要使用命名chunk,一个特殊的注释语法来提供chunk name(webpack>2.4) const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue')
原文出处:https://www.cnblogs.com/halfsoul/p/12347148.html