本文最后更新于:2024年4月25日 上午
路由模板
🌰提供路由渲染
router-link
标签提供路由地址选项,在to
属性中指定路由地址
1 2 3 4 5
| <nav> <router-link to="/" >地址一</router-link> <router-link to="/posts">地址二</router-link> </nav>
|
router-view
标签渲染出选中路由
1 2 3
| <main> <router-view></router-view> </main>
|
🌰定义路由组件
1 2 3 4
| const [HOME, POSTS] = [ { template: '<div>主页</div>' }, { template: '<div>文章</div>' } ]
|
🌰定义路由
path
与component
为必选项
1 2 3 4
| const routes = [ { path: '/', component: HOME }, { path: '/posts', component: POSTS } ]
|
🌰创建实例并配置routes
1 2 3 4
| const router = new VueRouter.createRouter({ history: VueRouter.createWebHashHistory(), routes, })
|
🌰创建并挂载路由
1 2
| const app = Vue.createApp({}) app.use(router).mount('#app')
|
获取路由
使用this.$route
或在setup
内用createRouter
创建可获得路由信息对象
1 2 3
| this.$route.path this.$route. this.$params
|
动态路由
用/:rute
来表示路径参数
不同参数都会映射至父级路径
1 2 3
| const routes = [ { path: '/user/:id', component: USER } ]
|
路由匹配
🌿同父级路径的动态路由
在路径后加/:rute(reg)
来匹配不同路由
1 2 3 4
| const routes = [ { path: '/:id(\\d+)', component: USER }, { path: '/:piicture', component: PICTURE } ]
|
🌿多级动态路由
在路径末加*
(零个以上),+
(一个以上)来匹配重复项
1 2 3
| const routes = [ { path: '/:option(//d+)*' component: OPTIONS } ]
|
🌿可选动态路由
在路径末加?
表示路径至多有一个
1 2 3 4
| const routes = [ { path: '/:id(//d+)/:name?', component: USER } ]
|
嵌套路由
在路由children
属性内可添加子路由,在父组件的router-view
标签内渲染子组件
子路由设置path
为''
为默认时渲染
1 2 3 4 5 6 7 8 9 10 11
| const routes = [ { path: '/:id(\\d+)', component: USER, children: [ { path: '', component: DEFAULT }, { path: 'message', component: MESSAGE }, { path: 'pictures', component: PICTURES } ] } ]
|
编程式导航
🥑导航至不同位置
触发router-link
即调用router.push()
方法
有path
属性时,params
属性将失效
1 2 3 4 5 6 7 8 9
| router.push('/users/eduardo')
router.push({ path: '/users/eduardo' })
router.push({ name: 'user', params: { username: 'eduardo' } })
router.push({ path: '/register', query: { plan: 'private' } })
router.push({ path: '/about', hash: '#team' })
|
🥑替换当前位置
使用replace
不会向history
增加记录而是替换当前记录
声明式:
1
| <router-link to="/user" replace></router-link>
|
编程式:
1 2
| router.replace({ path: '/user' }) router.push({ path: '/user', replace: true })
|
命名路由
使命名的路由可简便的调用
1 2 3 4 5 6 7
| const routes = [ { path: '/user/:id/:name', name: 'user', component: USER } ]
|
编程式:
1 2 3 4 5 6 7
| router.push({ name: 'user', params: { id: 001, name: 'Jonathan' } })
|
声明式:
1 2 3
| <router-link to="{ name: 'user', params: { id: 001, name: 'Jonathan' } }"> 个人信息 </router-link>
|
命名视图
可以在同一组件内渲染多个router-view
1 2 3 4
| <router-view></router-view> <router-view name="Docs"></router-view> <router-view name="Header"></router-view>
|
为多个组件指定渲染视图
1 2 3 4 5 6 7 8 9 10
| const routes = [ { path: '/', components: { default: Menu, Docs: Docs, Header: Header } } ]
|
重定向
将路由1
跳转至路由2
可将没有锚点的路由/
重定向至主页面路由/home
重定向可以是路径
,方法
,命名路由
1 2 3 4
| const routes = [ { path: '/', redirect: '/home' }, { path: '/home', component: Home } ]
|
别名
路由组件传参
🍆布尔模式
设置props
为true
即可将router.params
属性赋给组件的props
1 2 3 4 5 6 7 8
| const USER = { props: ['id'] template: '<div>{{ id }</div>' }
const routes = [ { path: '/user/:id', component: USER, props:true } ]
|
🍆命名视图
可为不同的视图设置props
1 2 3 4 5 6 7 8 9 10 11 12 13
| const routes = { path: '/user/:id', components: { default: User, Docs, Posts }, props: { default: false, Docs: true, Posts: false } }
|
🍆对象模式
导航守卫
🥬全局前置守卫
全局前置守卫会按创建顺序执行,在所有守卫resolve
完前状态均为pending
beforeEach((to, from[, next]) => {})
返回true
或不返回表示导航有效
返回false
取消导航,回至from
返回路由对象
导航至该路由对象
to
:正在进入的路由对象
from
:正在离开的路由对象
执行下一个
停止导航,回到from
改变to
路由对象
导航终止,Error
传给回调router.onError
1 2 3 4 5
| const router = new VueRouter({...}) router.beforeEach(('/user', '/home', next) => { next(...) })
|
🥬全局后置钩子
后置钩子不会改变导航,不接受next
,其用于改变页面标题等功能
afterEach((to, from[, failure]) => {})
🥬路由独享守卫
可以直接在routes
中配置守卫,守卫只有从不同路由进入才触发,动态参数改变不触发
1 2 3 4 5 6 7 8 9
| const routes = [ { path: '/user/:id', component: User, beforEach: (to, from, next) => { } } ]
|
路由元信息
可以附加所需信息至meta
属性,路由地址与导航守卫均可访问
1 2 3 4 5 6 7 8
| const routes = [ { meta: { isAuthentication: true } } ]
|
1 2
| $route.meta $route.matched[].meta
|
数据获取