hash模式:
history模式:
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
route = []
router = new Router({
route,
mode: 'hash',
scollBehavior: (to, from, savedPosition) {
if(to.hash) {
return {
selector: to.hash,
behavior: 'smooth'
}else if(savedPosition) {
return savedPosition
})else {
return { x: 0, y: 0 }
}
}
}
})
router.beforeEach((to, from, next) => {
//TODO
}
const routerPush = Router.prototype.push
Router.prototype.push = function push(to) {
return routerPush.call(this, to).catch(err => err)
}
const routerReplace = Router.prototype.replace
Router.prototype.replace = function replace(to) {
return routerReplace.call(this, to).catch(err => err)
}
export deault router
// main.js
import router from './router'
new Vue({
router,
render: h => h(App)
}).$mount('#app')
元信息,主要是传递是否需要鉴权、登录、页面title等信息,子组件中通过this.$route.meta获取到
router-link 标签
属性:
返回的是一个Promise,返回一个promise,可以链式调用then、catch
this.$router.push(path|location|name|function)
this.$routter.replace(path|location|name|function)
beforeEach -> beforeEnter -> beforeRouteEnter/beforeRouteUpdate -> beforeResolve -> afterEach
在开始跳转到目标路由之前执行,主要进行鉴权、登录等校验,在每次导航开始时触发
在路由跳转完成后被调用。全局后置守卫主要用于执行一些在路由跳转后需要进行的操作,例如页面滚动、统计PV(页面浏览量)等。
在路由each、enter之后执行,主要进行路由解析,主要用于在进入路由前执行异步操作,如数据预加载
beforeEnter(to,from, next),在和beforeEach完全相同,如果都设置则在beforeEach之后紧随执行。在进入特定路由之前触发,不会在重复导航到相同路由(即使参数不同)或uodate时触发
在组件中设置,在beforeEnter之后执行,
在组件中设置,调用时机:当路由参数发生变化导致该组件被复用时调用。
在组件中设置,调用时机:在导航离开该组件的路由时调用。
export default{
data(){
return{}
},
beforeRouteEnter(to, from, next) {
// 在渲染该组件的对应路由被 confirm 前调用
// 不!能!获取组件实例 `this`
// 因为当守卫执行前,组件实例还没被创建
},
beforeRouteUpdate(to, from, next) {
// 在当前路由改变,但是该组件被复用时调用
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
// 可以访问组件实例 `this`
},
beforeRouteLeave(to, from, next) {
// 导航离开该组件的对应路由时调用
// 可以访问组件实例 `this`
}
父子路由,子路由的path必须以父路由的path为前缀,如:/user/:id/profile,/user/:id/profile/edit
const router = new Router({
routes: [
{
path: '/user',
component: User,
redirect: '/user/profile',
children: [
{
path: 'profile',
component: Profile
name: 'profile'
meta: {
title: 'profile'
requireAuth: true
requireLogin: true
requireAdmin: true
requireRole: 'admin'
requirePermission: ['profile','edit','delete','add','update','list','detail','create','delete','update']
}
}
]
<router-view></router-view>
new Router({
scrollBehavior(to, from, savedPosition) {}
})
scrollBehavior(to, from, savedPosition) {
return { x: 0, y: 0 }}
}
或者
scrollBehavior(to, from, savedPosition) {
return {
top: 0
}
}
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition
}
}
定位到锚点或者某个元素上
scrollBehavior(to, from, savedPosition) {
定义到某个css选择器对应的元素上
return { selector: '#el' }
}
或者
scrollBehavior(to, from, savedPosition) {
if(to.hash){
return {
d定位到锚点
selector: to.hash
相对锚点的偏移量
offset: {
x: 0,
y: 100 //偏移方向
}
// 平滑滚动
behavior: 'smooth'
}
}
path: ‘/user/:id’,根据id展示不同的页面信息。id必须传,不然页面渲染失败,如果不想必传递,可以设置为path: ‘/user/:id?’,
如果像设置默认值,可以全局前置守护、路由前置守护中设置,或者在组件的props或者data、computed中设置