
目录
1、创建vue-router
2、使用vue-router
2.1、路由的基本使用
2.2、多级路由(嵌套路由)
2.3、路由的query参数
2.4、路由命名(简化里面to的长度)
2.5、路由的params参数
2.6、路由的props配置(简化在模版里获取query和params)
2.6.1、第一种传props方法
2.6.2、第二种传props的方式
2.6.3、第三种传props的方式
2.7、的replace属性
2.8、脱离router-link实现路由跳转(使用$router的push和replace)
2.9、缓存路由组件
2.10、路由组件的两个新的生命周期钩子(actived和deactivated(失活))
3、路由守卫
3.1、全局路由守卫
3.2、独享路由守卫
3.3、组件内的路由守卫
4、history模式和hash模式
1、创建vue-router(1)首先下载vue-router,注意vue2只能用vue-router3版本,vue3只能用vue-router4版本
npm i vue-router@3(2)在src文件夹下创建一个router的文件夹,再在里面创建一个index.js文件,用来做路由器,内容如下。
import VueRouter from "vue-router"; export default new VueRouter({ routes:[] })(3)在main.js里面引入路由器,并且使用vue-router插件,并加入router配置项
import Vue from 'vue' import App from './App.vue' //引入 import VueRouter from "vue-router" import router from "../src/router" Vue.config.productionTip = false //使用插件 Vue.use(VueRouter) new Vue({ render: h => h(App), //配置项 router, }).$mount('#app')当url的后面有个#时说明配置成果
2、使用vue-router 2.1、路由的基本使用在components文件夹下创建一个pages文件夹用于存放页码的组件,然后创建如下页面
About Home 我是About的内容我是Home的内容最后在App.vue里面使用组件MyNav.vue
//App.vue总结注意点:
1、每个组件都有自己的$route属性,整个应用只有一个$router,组件也可以获取
2、pages里面存放路由组建
3、路由切换后,之前的组件是被销毁了的
4、用router-link替换a,用to替换href,用active-class绑定动态属性,
5、用router-view来放切换的路由
2.2、多级路由(嵌套路由)首先在创建两个路由组件作MyHome的子路由,然后在router/index.js里面的home路由下用children添加子路由
//pages/MessagePage.vue message001 message002 message003//pages/NewsPage.vue news001 news002 news003使用两个子组件
//MyHome.vue Home组件内容News Message 配置多级路由
2.3、路由的query参数//src/router/index.js,配置多级路由 import VueRouter from "vue-router"; import MyAbout from '../components/pages/MyAbout' import MyHome from '../components/pages/MyHome' import NewsPage from '../components/pages/NewsPage' import MessagePage from '../components/pages/MessagePage' export default new VueRouter({ routes:[ { path:'/about', component:MyAbout }, { path:'/home', component:MyHome, children:[ { path:'news', component:NewsPage }, { path:'message', component:MessagePage } ] } ] })首先创建一个属于MessagePage的三级的路由DetailPage.vue,并用组件上的$route获取query上的id和name的值
// pages/DetailPage.vue {{$route.query.id}} {{$route.query.name}}再router里面配置路由
// src/router/index.js import VueRouter from "vue-router"; import MyAbout from '../components/pages/MyAbout' import MyHome from '../components/pages/MyHome' import NewsPage from '../components/pages/NewsPage' import MessagePage from '../components/pages/MessagePage' import DetailPage from "../components/pages/DetailPage" export default new VueRouter({ routes:[ { path:'/about', component:MyAbout }, { path:'/home', component:MyHome, children:[ { path:'news', component:NewsPage }, { path:'message', component:MessagePage, children:[ { path:'detail', component:DetailPage } ] } ] } ] })在MessagePage.vue里面传入query,有两种方式
2.4、路由命名(简化{item.name}} -->{{item.name}}
里面to的长度) -->还是对上面的进行修改
// src/router/index.js import VueRouter from "vue-router"; import MyAbout from '../components/pages/MyAbout' import MyHome from '../components/pages/MyHome' import NewsPage from '../components/pages/NewsPage' import MessagePage from '../components/pages/MessagePage' import DetailPage from "../components/pages/DetailPage" export default new VueRouter({ routes:[ { path:'/about', component:MyAbout }, { path:'/home', component:MyHome, children:[ { path:'news', component:NewsPage }, { path:'message', component:MessagePage, children:[ { //这里加了名字 name:'xijie', path:'detail', component:DetailPage } ] } ] } ] })2.5、路由的params参数{{item.name}}
首先在router里面的要跳转的地方加上params参数的占位符
//src/router/index.js import VueRouter from "vue-router"; import MyAbout from '../components/pages/MyAbout' import MyHome from '../components/pages/MyHome' import NewsPage from '../components/pages/NewsPage' import MessagePage from '../components/pages/MessagePage' import DetailPage from "../components/pages/DetailPage" export default new VueRouter({ routes:[ { path:'/about', component:MyAbout }, { path:'/home', component:MyHome, children:[ { path:'news', component:NewsPage }, { path:'message', component:MessagePage, children:[ { //如果使用对象的形式传params参数的话需要用name,不能用path name:'xijie', //这里记得加上params的占位符 path:'detail/:id/:name', component:DetailPage } ] } ] } ] }){{$route.params.id}} {{$route.params.name}}{item.name}}{{item.name}}
2.6、路由的props配置(简化在模版里获取query和params) 首先现在Detail.vue页面用props接受参数进行简写
2.6.1、第一种传props方法//Detail.vue {{id}} {{name}}弊端是穿的props是固定的
2.6.2、第二种传props的方式// router/index.js import VueRouter from "vue-router"; import MyAbout from '../components/pages/MyAbout' import MyHome from '../components/pages/MyHome' import NewsPage from '../components/pages/NewsPage' import MessagePage from '../components/pages/MessagePage' import DetailPage from "../components/pages/DetailPage" export default new VueRouter({ routes:[ { path:'/about', component:MyAbout }, { path:'/home', component:MyHome, children:[ { path:'news', component:NewsPage }, { path:'message', component:MessagePage, children:[ { name:'xijie', path:'detail/:id/:name', component:DetailPage, //这是第一种传props的方法,不好的地方是,穿的值是固定的 props:{id:"001",name:'我是第一种props'} } ] } ] } ] })这种方式,只能吧params的参数通过props传给该组件,缺点是不能传query
2.6.3、第三种传props的方式// router/index.js import VueRouter from "vue-router"; import MyAbout from '../components/pages/MyAbout' import MyHome from '../components/pages/MyHome' import NewsPage from '../components/pages/NewsPage' import MessagePage from '../components/pages/MessagePage' import DetailPage from "../components/pages/DetailPage" export default new VueRouter({ routes:[ { path:'/about', component:MyAbout }, { path:'/home', component:MyHome, children:[ { path:'news', component:NewsPage }, { path:'message', component:MessagePage, children:[ { name:'xijie', path:'detail/:id/:name', component:DetailPage, //这种方式,只能吧params的参数通过props传给DetailPage.vue,缺点是不能传query props:true, } ] } ] } ] })通过函数的方式穿props,props函数会接收到一个$route,然后就可以返回query或者params
2.7、import VueRouter from "vue-router"; import MyAbout from '../components/pages/MyAbout' import MyHome from '../components/pages/MyHome' import NewsPage from '../components/pages/NewsPage' import MessagePage from '../components/pages/MessagePage' import DetailPage from "../components/pages/DetailPage" export default new VueRouter({ routes:[ { path:'/about', component:MyAbout }, { path:'/home', component:MyHome, children:[ { path:'news', component:NewsPage }, { path:'message', component:MessagePage, children:[ { name:'xijie', path:'detail', component:DetailPage, //通过函数的方式穿props,props函数会接收到一个$route,然后就可以返回query或者params props($route){ return {id:$route.query.id,name:$route.query.name} } } ] } ] } ] })的replace属性 在router-link上有一个replace属性,添加上以后,他就会替换到上一次的浏览地址,所以点浏览器返回上一次按钮时会到没加replace的那个路由上
2.8、脱离router-link实现路由跳转(使用$router的push和replace){{item.name}}
push类似于没加replace,replace类似于加了replace,(什么鬼,哈哈哈)
2.9、缓存路由组件
当我们切换路由的时候,上一次的路由页面就会被销毁,如果我们不想让他销毁,就可以使用一个keep-alive组件包裹一下router-view,用include属性可以指定那个路由不被销毁,不指定就是全部不销毁。
加:如果想缓存多个,前面加冒号里面写数组
Home组件内容News Message 2.10、路由组件的两个新的生命周期钩子(actived和deactivated(失活))news001 news002 news003在这样的场景下,当我们在组件一挂载的时候产生一个定时器,当我们销毁页面之前时想让他吧定时器也销毁,这样是可以的,但是当我们这个页面放在了keep-alive里面的时候,就不会出发beforeDestory()这个钩子,这时我们就需要这两个专属于组件的钩子。
相当于当页面显示的时候触发actived钩子
当页面隐藏的时候出发deactived钩子
3、路由守卫 3.1、全局路由守卫news001 news002 news003全局前置路由守卫(router.beforeEach()):
我们可以在route上的meta里面存放我们自己想放的属性
然后通过router的beforeEach判断这个路由需不需要校验权限,需要的话进行校验,不需要的话直接通过next放行。全局后置路由守卫(afterEach()):
这个守卫没有next放行的权限,只有在页面完成了跳转才会执行,一般用在设置网页的title。3.2、独享路由守卫//src/router/index.js import VueRouter from "vue-router"; import MyAbout from '../components/pages/MyAbout' import MyHome from '../components/pages/MyHome' import NewsPage from '../components/pages/NewsPage' import MessagePage from '../components/pages/MessagePage' import DetailPage from "../components/pages/DetailPage" const router = new VueRouter({ routes:[ { path:'/about', component:MyAbout }, { path:'/home', component:MyHome, children:[ { name:'news', path:'news', component:NewsPage, meta:{isAuth:true} }, { path:'message', component:MessagePage, children:[ { name:'xijie', path:'detail', component:DetailPage, // props:{id:"001",name:'我是第一种props'} // props:true, props($route){ return {id:$route.query.id,name:$route.query.name} } } ] } ] } ] }) /* 全局前置路由守卫: 我们可以在route上的meta里面存放我们自己想放的属性 然后通过router的beforeEach判断这个路由需不需要校验权限,需要的话进行校验,不需要的话直接通过next放行, */ router.beforeEach((to,from,next)=>{ if(to.meta.isAuth){ if(localStorage.getItem('pass') == "true"){ next() }else{ alert('无权查看') } }else{ next() } }) /* 全局后置路由守卫 这个守卫没有next放行的权限,只有在页面完成了跳转才会执行,一般用在设置网页的title */ router.afterEach((to,from)=>{ document.title = to.name || '测试title' }) export default router独享路由守卫只有beforeEnter,写法和全局路由守卫的前置守卫一样
3.3、组件内的路由守卫//src/router/index.js import VueRouter from "vue-router"; import MyAbout from '../components/pages/MyAbout' import MyHome from '../components/pages/MyHome' import NewsPage from '../components/pages/NewsPage' import MessagePage from '../components/pages/MessagePage' import DetailPage from "../components/pages/DetailPage" const router = new VueRouter({ routes:[ { path:'/about', component:MyAbout }, { path:'/home', component:MyHome, children:[ { name:'news', path:'news', component:NewsPage, meta:{isAuth:true}, //这里是局部路由守卫 beforeEnter(to,from,next){ if(to.meta.isAuth){ if(localStorage.getItem('pass') == "true"){ next() }else{ alert('无权查看') } }else{ next() } } }, { path:'message', component:MessagePage, children:[ { name:'xijie', path:'detail', component:DetailPage, // props:{id:"001",name:'我是第一种props'} // props:true, props($route){ return {id:$route.query.id,name:$route.query.name} } } ] } ] } ] }) router.afterEach((to,from)=>{ document.title = to.name || '测试title' }) export default router这两个守卫是通过路由规则进入或者离开这个路由才会触发beforeRouteEnter(),
beforeRouteLeave()
4、history模式和hash模式//MyAbout.vue 我是About的内容路由器默认是hash模式,处于hash模式下会在ip后面加上一个“#”,hash模式的兼容性好,打包部署上线完成后,进行路由跳转后,刷新页面,不会产生页面404,而history模式下没有#,但是会出现404,需要后端去用nignx,或者用其他方法,nodejs部署的话在npm上有个connect-history-fallback,可以使用,也可以解决。
Vue2部分完结
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)