路由就是URL到函数的映射;前端路由就是由前端控制的URL和页面之间的映射关系;为减少页面到服务器的访问次数,现在大多数项目都采用SPA(单页面富应用)模式,而SPA就是前端路由广泛应用的例子;那么前端是怎么控制URL到对应的页面并且不刷新向服务器的请求,很容易就想到我们的URL中hash值改变不会刷新页面,还有H5中history 新增的pushState()和replaceState()方法;我们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 |
//router.js //1.导入路由 import VueRouter from 'vue-router' const Home = () => import('@/views/home/Home')//导入页面组件(注意:路由懒加载写法) //2.安装路由 Vue.use(VueRouter) const routes = [//配置路由映射关系 { path:'', redirect:'/home'//路由重定向 }, { path:'/home', component:Home } ]; //3.实例化路由 const router = new VueRouter({ routes, mode:"history"//设置路由模式,可以设置hash模式和history模式 }); //4.导出路由 export default router //main.js import router from './router'//引入router new Vue({ router,//全局注册router,以后可以在任何地方使用$router render: h => h(App), }).$mount('#app') //home.vue <router-link to='/regist'>首页</router-link>//导航选项,会被解析成a标签 <router-view></router-view>//相当于占位符,组件需要在什么地方展示写在什么地方 |
{path:'',redirect:'/home'}
{path:'/home',components:{default:header,left:lefter,right:righter}}
;然后再去需要引入的地方,引入name值为这个变量的router-view标签 <router-view name='left'>
{path:'/home',children:[{path:'head/log2',component:log2},{path:'head/reg2',component:reg2}]}
;然后再去需要嵌套的地方嵌套子路由mode:'history'
,默认时hash{path:'/shopCar',meta:{title:'购物车'}}
;然后到当前路由下设置全局title:document.documentElement.title = this.$route.meta.title
;如果存在路由嵌套拿不到meta.title,可以去 this.$route.matched.meta[0].title ) const Home = ()=> import('@/view/home/home')
this.$router.push({name:'home',params{id:222}})
this.$router.push({path:'home',query{id:222})
http://localhost:8080/workorder/newApply
而query传参更像是get请求会带所有信息http://localhost:8080/workorder/newApply?type=BOX_DEPLOY&typeDesc=%E5%B0%8F%E7%99%BD%E7%9B%92%E9%83%A8%E7%BD%B2
关于$router、$route、<router-link>、<router-view>的api可以参阅: https://router.vuejs.org/zh/api/#append
{path:'/home/:iid',component:{}}
<router-link :to="'/home/' + iid">
;编程式this.$route.params.iid
;这里的iid最好写在props里声明式导航:<router-link to='/home'>
编程式导航:this.$router.push('./home')
有些业务是需要我们在路由跳转的过程中实现的,vue-router就提供了导航守卫来监听路由跳转的各个阶段;导航守卫可以分为以下几种
router.beforeEach((to,from,next)=>{console.log(to)})
routers:[path:'/home',component:Foo,beforeEnter:(to,from,next)=>{console.log(to)}]
beforeRouteEnter (to,from,next){console.log(to)}
beforeRouteLeave
守卫beforeEach
守卫beforeRouteUpdate
守卫 (2.2+)beforeEnter
beforeRouteEnter
beforeResolve
守卫 (2.5+)afterEach
钩子在平时的开发中,我们有时没必要多次初始化组件,我们需要维持组件的状态不变,在下次展示的时候也不会重新初始化组件;keep-alive是一个VUE的内置组件, 它可以使被包含的组件保留状态,或避免重新渲染 。也就是所谓的组件缓存
被keep-alive包裹的组件不会被重新渲染,也就是不会再次触发生命周期钩子函数,这时候被keep-alive包裹的组件就会多出两个生命周期函数 activated: 组件再次渲染的时候触发 ;deactivated:组件销毁的时候触发
配合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 |
//所有组件都缓存 <keep-alive> <router-view/> </keep-alive> //只有组件name值的组件缓存 <keep-alive include='组件name值'> <router-view/> </keep-alive> //除了组件name值的组件外这里得所有组件都缓存 <keep-alive exclude='组件name值'> <router-view/> </keep-alive> //使用meta值判断哪个组件缓存哪个组件不缓存 // routes 配置 export default [ { path: '/', component: Home, meta: { keepAlive: true // 需要被缓存 } }, { path: '/profile', component: Profile, meta: { keepAlive: false // 不需要被缓存 } } ] //使用 <keep-alive> <router-view v-if="$route.meta.keepAlive"/> </keep-alive> |