赞
踩
Vue Router是Vue.js官方的路由管理器。它和Vue.js的核心深度集成,让构建单页面应用变得简单。包含的功能:
包含的组件
4. <router-link>
5. <router-view>
我们可以在vue-router的路由路径中使用“动态路径参数”来达到这个效果,动态路径参数以冒号开头。
怎么获取?
一个“路径参数”使用冒号:
标记,当匹配到一个路由时,参数值会被设置在this.$route.params
,可以在每个组件中使用。
或者通过普通?name=xxx来传参,参数会存放在this.$route.query
中,
区别:query通过url传参,刷新页面参数还在,params刷新页面参数就不在了。为什么
因为在组件中使用$route会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的URL上使用,限制了其灵活性,所以要解耦。
耦合如以下代码所示,Home组件只有在http://localhost:8036/home/123
URL上才能使用。
const Home = {
template:`
<div>User {{$route.params.id}}</div>
`,
}
const router = new VueRouter({
routes:[{
path:'/home/:id',
component:HOme
}],
})
使用props
来解耦
route.params
会被设置为组件属性http://localhost:8080/home?id=123
,会把123传给组件Home的props的idconst Home = { props:['id'], template:`<div>{{id}}</div>`, } const router = new VueRouter({ routes:[{ path:'/home/:id', component:Home, props:true, //对于包含命名视图的路由,你必须分别为每个命名视图添加props选项: },{ path:'/home/:id', component:{ default:Home, sidebar:Sidebar }, props:{ default:true, sidebar:false, }, },{ path:'/home', component:Home, props:{ id:123, }, },{ path:'/home', component:Home, props:(route) => { id:route.query.id } }], })
router.beforeEach(to,from,next)
router.beforeResolve(to,from,next)
router.afterEach(to,from)
beforeEnter(to,from,next)
beforeRouteEnter(to,from,next)
beforeRouteUpdate(to,from,next)
beforeRouteLeave(to,from,next)
$router对象: $router对象是全局路由的实例,是new VueRouter()的实例
$route表示当前的路由信息
当使用动态路径参数
时,原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。
beforeRouteUpdate(to,from,next)
watch:{
$route:{
handler(to,from){
},
immediate:true,
}
}
router-view
添加一个不同的key,这样就不会重用组件了let routes = [{
path:'/index',
name:'index',
component:() => import('@/components/index')
}]
设置redirect
属性为重定向的位置
{
path:'/comp1',
name:'comp1',
component:() => import('@/components/comp1'),
redirect:'/comp2',//第一种方式
redirect:{name:'comp2'},//第二种方式
refirect:to => {//第三种方式
const {hash,params,query} = to
if(query.to === 'foo'){
return {path:'/foo',query:null}
}else {
return '/b'
}
},
}
在routes数组的最后一项设置path:*的配置项
//放在最后
{
path:'*',
component:() => import('@/components/none404'),
}
<keep-alive>
<router-view></router-view>
</keep-alive>
导航被触发。
解析异步路由组件。
5. 在被激活的组件里调用 beforeRouteEnter。
6. 调用全局的 beforeResolve 守卫 (2.5+)。
导航被确认。
7. 调用全局的 afterEach 钩子。
触发 DOM 更新。
8. 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。
路由导航守卫都是在Vue实例生命周期钩子函数之前执行的。
//to:即将要进入的目标路由对象
//from:当前导航正要离开的路由对象
//next:函数,必须调用,不然路由跳转不过去。其中:
//next():正常进入下一个路由
//next(false):中断当前的导航
//next('/'): 重定向到其它路由
beforeEach(to,from,next){
}
不可以,不接受next
参数
beforeRouteEnter
导航守卫中可以用this
吗?不可以,因为守卫在导航确认前被调用,新组建还没有被创建。
可以通过传一个回调给next来访问组件实例,在导航被确认???不应该是组件创建完成吗
的时候执行回调,并且把组件实例作为回调方法的参数。
<router-link>
是vue router的内置组件,在具有路由功能的应用中作为声明式的导航使用。有8个porps
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。