在vue-router控制前端權(quán)限是常見(jiàn)需求:
我們希望還有更簡(jiǎn)單的方式。這個(gè)時(shí)候梳理一下需求,我們的主要目標(biāo)是:
第一、第二個(gè)目標(biāo)是容易實(shí)現(xiàn)的,把權(quán)限列表傳入對(duì)應(yīng)組件,通過(guò)v-if判斷即可,需要解決的是越權(quán)頁(yè)面的攔截問(wèn)題。在上面常見(jiàn)的做法中,為了實(shí)現(xiàn)攔截,單獨(dú)寫(xiě)了一個(gè)登錄頁(yè)面,登錄之后再根據(jù)權(quán)限加載路由,這樣,沒(méi)有權(quán)限的路由根本不會(huì)加載,于是被導(dǎo)向404頁(yè)面。
那么,現(xiàn)在的問(wèn)題是,怎么樣會(huì)有更簡(jiǎn)單的方式?
顯然,如果我們不想單獨(dú)寫(xiě)login頁(yè)面,那么router在登錄前就完成加載了。如果無(wú)法通過(guò)router自動(dòng)將越權(quán)頁(yè)面導(dǎo)向404頁(yè)面,我們能做的,只能手動(dòng)引導(dǎo)了。思路清楚了,實(shí)現(xiàn)起來(lái)就毫無(wú)壓力:
根據(jù)vue組件的生命周期,我們可以在mounted鉤子上進(jìn)行權(quán)限判斷,如果通過(guò)props傳入的用戶(hù)權(quán)限列表沒(méi)有對(duì)應(yīng)權(quán)限,就跳轉(zhuǎn)頁(yè)面到404:
mounted () { if (!this.check_user_privilege (current_page)) { this.$Message.error('權(quán)限不足'); this.$router.push('404'); } }
當(dāng)然,事實(shí)上vue-router也提供了頁(yè)面跳轉(zhuǎn)時(shí)的鉤子方法,全局的有beforeEach、afterEach等,我們希望直接在組件內(nèi)使用,則可以使用beforeRouteEnter方法,在進(jìn)入頁(yè)面時(shí)進(jìn)行判斷,比如:
beforeRouteEnter (to, from, next) { next(vm => { if (!vm.check_user_privilege (current_page)) { vm.$Message.error('權(quán)限不足'); vm.$router.push('404'); } }) },
具體可以參考[文檔]。
當(dāng)然,就這個(gè)例子來(lái)說(shuō),用vue-router提供的鉤子還不如直接在mounted寫(xiě)判斷條件,因?yàn)閎eforeRouteEnter方法中的next需要調(diào)用組件參數(shù),是在mounted執(zhí)行之后才執(zhí)行的,而我們又經(jīng)常需要在mounted鉤子加載頁(yè)面數(shù)據(jù),為了避免浪費(fèi),先進(jìn)行判斷是比較好的。
和常用方法相比,簡(jiǎn)單方法是有額外開(kāi)銷(xiāo)的,主要在于需要完全加載路由,同時(shí)在加載頁(yè)面后進(jìn)行了一次判斷。不過(guò)從寫(xiě)代碼的角度來(lái)說(shuō),似乎邏輯上更節(jié)約,因?yàn)椴挥昧硗鈱?xiě)一個(gè)集中進(jìn)行權(quán)限控制的文件了,至于每個(gè)頁(yè)面的權(quán)限判斷,那是本來(lái)在菜單欄就要做的事情,延伸到不同頁(yè)面也不算什么負(fù)擔(dān)。
會(huì)不會(huì)有什么副作用呢?暫時(shí)來(lái)看似乎是沒(méi)有的,如果在mounted最開(kāi)始就進(jìn)行頁(yè)面權(quán)限判斷,也不會(huì)有加載越權(quán)數(shù)據(jù)的問(wèn)題,況且數(shù)據(jù)權(quán)限是后端需要單獨(dú)判斷的,不應(yīng)該讓前端去擔(dān)心。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注