之前有预告过,发送 API 的时机点需视不同情境及 UX 体验规划而定,因此除了选择在元件内的生命周期 created
发送,另外在 Vue Router 还有像警卫一般的「导航守卫(Navigation Guards)」,分别可以驻守在全域、路由和元件内。
在导航守卫文件的最底部,已先整理出 Resolution Flow 让我们知道3种守卫位置、7个守卫时机的先後顺序,以便根据专案需求在合适的时间点发送 API 或执行其他动作。
(图片来源:Vue Router - Navigation Guards - The Full Navigation Resolution Flow)
三种守卫位置分别在趋近目标路由的过程中慢慢收敛守卫范围,由大至小分别是在全域、路由、元件内调用。
to
:即将进入的目标路由from
:准备离开的上个路由next
(必选):继续执行的 callback 函式,必须呼叫 next()
才会执行下一步;因此在所有导航守卫中为必选程序,在同一个导航守卫中可使用一或多次beforeEach
:进入每个路由之前
beforeResolve
:在路由完成跳转之前,但所有元件内守卫和路由元件已完成解析
afterEach
:每个路由完成跳转之後
应用范例:登入系统需要验证会员身份,部分路径内容会根据使用者身份限制浏览范围或操作行为,例如成为正式会员之後才能在网站内进行购买商品。因此会选择在全域 beforeEach
进入每一个路由之前就先判断会员目前的状态,若该路径仅限於会员才能进入,就会将使用者导向登入页面,引导使用者注册为会员。
routes 中的每个路由物件称为 route record,通常会搭配设置 Route Meta 限制个别路由的权限,并在每次进入路由之前先判断 route record 所设置的 meta
状态,再做接下来的导向流程。
const router = new VueRouter({
routes: [
{
path: "/member",
redirect: { name: "Profile" },
component: MemberPage,
children: [
{
path: "collection",
name: "Collection",
component: Collection,
},
{
path: "collection/purchase/:bookName",
name: "Purchase",
component: Purchase,
meta: { requiresAuth: true } // 设为需为登入状态
},
],
}
]
})
// 全域设置进入路由之前的时间点
router.beforeEach((to, from, next) => {
// 当路由物件的 meta 设有 requiresAuth 时
if (to.matched.some(record => record.meta.requiresAuth)) {
// 尚未登入
if (!Token) {
next({ path: '/login' }) // 导向登入页面
} else {
next() // 登入成功,则可继续往下执行
}
} else {
next() // 确保一定要使用 next()
}
})
beforeEnter
:准备进入单一路由之前beforeEnter
,不会影响到其他路由。beforeRouteEnter
:路由进入元件之前beforeRouteUpdate
:具有相同元件的路由发生更新时beforeRouteLeave
:路由离开元件之前beforeRouteUpdate
发送 API 即时接收资料,才能在路由切换之後重新接收资料并渲染至画面上。
>>: javascript表单资料处理&验证(DAY22)
时常为自己排序 这是一个老生常谈的问题了,工作、家庭、财富、人际、健康,什麽对我们来说是最重要的?...
延续昨日 我们今天先把 登出的功能给搞定 不然每次都要清除session不然就是要重开== 由於我们...
【前言】 诸君日安,大魔王要出现啦!接下来要说的是Nonce 的使用、前後端连动,以及帐户验证。今...
接着在ActionBattle_SkillScene.js下继续写 定义一个类别为Window_Ke...
开启Word档案後先是脑袋一片空白於是请教了同事有没有计画书的范本,看完之後灵感有如用涌泉般的冒出,...