vue的路由使用在SPA应用中的组件跳转,相当于多页面的 a标签。
3.1)路由配置(json数组)
let routes = [ { path:'/goodslist', component:goodlist }, {path:'/goodsdetail',component:goodsdetail} ];3.2)、实例化一个vueRouter对象
let router = new VueRouter({ routes });实例化vue对象,(把vueRouter对象,挂载(注册)到vue对象里)
let vm = new Vue({ el:"#app", router:router });解释:
: 超链, 相当于标签a 。
: 组件显示的位置。
脚手架安装时,会默认安装vue-router。
如:HelloWorld.vue 、 Home.vue
4.1)、声明式跳转
<router-link to="/home">声明式跳转</router-link> <router-link to="/home" tag='li'>声明式跳转</router-link> <router-link to="/home" tag='li' >声明式跳转</router-link> <router-view>展示区</router-view>router-link 组件属性:
to:跳转的路径
tag=‘li’ 指定编译后的标签,默认是 a 标签。 router-link和router-view组件是vue-router插件提供的
4.2)编程式跳转(编程式导航)
this.$router.push(字符串/对象):添加一个路由 (记录到历史记录) // 字符串 router.push('home') // 对象 router.push({ path: 'home' }) // 命名的路由 router.push({ name: 'user', params: { userId: '123' }}) // 带查询参数,变成 /register?plan=private router.push({ path: 'register', query: { plan: 'private' }}) 注意:如果提供了 path,那么params 会被忽略2)、this.$router.replace({name:’…’}) //替换一个路由 (不记录到历史记录)
3)、this.$router.go(-1|1)|back() //回退/前进
路由配置
const router = new VueRouter({ routes: [ // 动态路径参数 以冒号开头 { path: '/user/:id', component: User } ] })跳转
<router-link to="/user/01001">用户01001的信息</router-link>组件中获取id的值
模板里的写法: $route.params.id 脚本里的写法: this.$route.params.id1)、通配符 *
'*' 会匹配所有路径 '/user-*' 会匹配以 `/user-` 开头的任意路径注意:路由匹配的顺序是按照路由配置的顺序进行的,所以,你肯定不能把 * 的路径放在最前面,否则,后面的路由配置都不起作用了。
当使用一个通配符时,$route.params 内会自动添加一个名为 pathMatch 参数。它包含了 URL 通过通配符被匹配的部分。
如:
路由配置:
{ // 会匹配以 `/user-` 开头的任意路径 path: '/user-*' }路由跳转:
this.$router.push('/user-admin')组件里:
this.$route.params.pathMatch // 'admin'404
{ path: '*', component: NoPage组件 }给路由起个名字,就可以使用名字来指定路由
1、路由配置
const router = new VueRouter({ routes: [ { path: '/user/:userId', name: 'user', component: User } ] })2、跳转
<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link> 一个组件在项目中,有两种使用方式(组件显示在浏览器上):
1、自定义标签的方式
2、使用路由跳转后显示
如果, 一个组件需要从外部传入数据, 并且在项目中,这两种方式的使用都会出现,那么,在组件内部就需要适应这两种情况。
如何使用 props 将组件和路由解耦:
props 被设置为 true,route.params 将会被设置为组件属性。
路由配置:
{ path: '/user/:id', component: User, props: true },组件:
const User = { props: ['id'], template: '<div>User {{ id }}</div>' }子路由嵌套
// src/router/index.js const router = new VueRouter({ routes: [ { path: '/user/:id', component: User, children: [ { // 当 /user/:id/profile 匹配成功, // UserProfile 会被渲染在 User 的 <router-view> 中 path: 'profile', component: UserProfile }, { // 当 /user/:id/posts 匹配成功 // UserPosts 会被渲染在 User 的 <router-view> 中 path: 'posts', component: UserPosts } ] } ] })全局守卫
// src/router/index.js //前置 router.beforeEach((to, from, next) => { // to: 目标路由 // from: 当前路由 // next() 跳转 一定要调用 next(false);//不让走 next(true);//继续前行 next('/login')//走哪 next({path:'/detail/2',params:{},query:{}})//带点货 // 守卫业务 if(to.path=='/login' || to.path=='/reg' || to.path=='/register'){ next() }else{ next('/login'); } }) //后置 router.afterEach((to,from)=>{ //全局后置守卫业务 })路由独享守卫
// src/router/index.js { path: '/user', component: User, beforeEnter: (to,from,next)=>{ //路由独享守卫 前置 console.log('路由独享守卫'); if(Math.random()<.5){ next() }else{ next('/login') } } },独享,没有后置
组件内部守卫
//组件内部钩子 beforeRouteEnter (to, from, next) {//前置 // 不!能!获取组件实例 `this` // 因为当守卫执行前,组件实例还没被创建 }, beforeRouteUpdate (to, from, next) { // 在当前路由改变,但是该组件被复用时调用 // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候, // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。 // 可以访问组件实例 `this` }, beforeRouteLeave (to, from, next) {//后置 // 导航离开该组件的对应路由时调用 // 可以访问组件实例 `this` }定义路由的时候配置 meta 字段
//src/plugins/router.js { path: '/home', component: Home, meta: { requiresAuth: true } }访问 meta 字段
this.$route.meta to.meta 当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。
在组件里,
$router:这是植入到根的vueRouter对象
$route: 当前路由对象。
在
任何