路由转发传参
我们在使用vue-router时,可能会在Vue实例对象中,写一些方法使用路由的方式完成跳转,其实这种方式也是可以进行转发的
this.$router.push("/main");
如上,可以使用字符串拼接,把参数拼接在后面,然后转发,完成参数传递
this.$router.push("/main/"+this.form.username); //拿取表单中的username值
更改/main的路由
{ path: '/main/:username', name: 'main', component: Main, props: true, }
更改main.vue组件
export default { props: ['username'], name:"main" }
完成以上操作就可以在Vue实例中使用路由也可以带参转发了
拓展:移除地址栏的 #
更改很简单,因为vue一共有两个模式
- hash:路径带#,也是默认的,如:localhost/#/login
- history:路径不带#符号,如:localhost/login
配置在路由文件里,完成如下配置
export default new Router({ mode: 'history', //更改模式为history,使得地址栏无# routes: [ { //登录项 path: '/login', name: 'login', component: Login }, ] });
核心:mode: 'history',
404定向页面
由于vue中都是以组件的形式存在的,所以我们需要的是一个组件来定义404页面
404.vue组件代码展示:
<template> <div> <h1>404,你已经来到了404的页面了</h1> </div> </template> <script> export default { name: "404" } </script> <style scoped> </style>
此组件专用请求资源为空后,需要展示的内容,这里为测试,所以只输出一句话
配置路由,404能被拦截的关键在于,我们页面请求是在路由核心配置里没有的条目,基于这一点,我们就可以使用 ' * ' 符号进行通配,如果其它路由都没有匹配上,说明请求路径不存在,则404
代码展示:
{ path: '/*', //通配,上面路由没匹配上的请求,转发到404 name: '404page', component: error404 }
结果画面:
路由钩子(进入路由,离开路由)
beforeRouteEnter:在进入路由之前执行
beforeRouteLeave:在离开路由之前执行
代码展示:
<template> <h1>详细信息导航</h1> </template> <script> export default { name: "user", beforeRouteEnter: (to,from,next)=>{ console.log('进入路由前执行路由钩子'); next(); //使用路由钩子必须要有next,不然就会停在这里 }, beforeRouteLeave: (to,from,next)=>{ console.log('离开路由前执行路由钩子'); next(); } } </script> <style scoped> </style>
路由钩子的参数说明:
- to:路由即将要跳转的路劲信息
- from:路由跳转前的路径信息
- next:路由的控制参数
- next()进入下一个页面,也可以叫路由方向,没有此句话的钩子会停在路由钩子内部
- next(' /path'),改变路由的跳转的方向,使其跳到另外一个路由
- next(false)返回原来的页面
- next((vm)=>{ })仅在beforeRouterEnter可用,vm是组件实例
代码展示:
<template> <diV> <h1>详细信息导航</h1> name:{{info.name}} <br> url:{{info.url}} </diV> </template> <script> export default { props: ['name'], name: "user", beforeRouteEnter: (to,from,next)=>{ console.log('进入路由前执行路由钩子'); next(vm=>{ vm.getData(); }); //使用路由钩子必须要有next,不然就会停在这里 }, beforeRouteLeave: (to,from,next)=>{ console.log('离开路由前执行路由钩子'); next(); }, data(){ return{ info:{ name: null, url:null } } }, methods: { getData: function (){ this.axios({method:'get',url:'http://localhost:8080/static/msg.json'}).then(respone=>(this.info=respone.data)); } } } </script> <style scoped> </style>
使用vm实例在beforeRouteEnter钩子里进行异步通信,等于是在进入组件前就使用axios拿到了数据,然后再渲染到组件中去
除了两个钩子的出现时机,上面的代码其它部分都是基本语法
注意:我们使用npm下载axios时需要下载两个,一个时axios本体,一个时整合vue和axios的vue-axios
//使用npm下载 npm install axios npm install --save vue-axios //使用cnpm下载 cnpm install axios cnpm install --save vue-axios
再main.js导入也需要注意,两个部件都需要导入
//导入
import axios from "axios"; import VueAxios from "vue-axios"; //使用实例 Vue.use(VueAxios,axios);
完结,撒花!