1. 程式人生 > >beforeRouteLeave指定返回鍵的路由

beforeRouteLeave指定返回鍵的路由

1、問題

有3個頁面:A、B、C
大致跳轉順序是這樣:
在這裡插入圖片描述
1、2、3、4是正常的按鈕進行的路由跳轉,紫色的線表示瀏覽器或者手機的返回鍵。現在我要實現的是在B按返回鍵會返回A,而實際上卻返回了C。

到B頁面的整個過程在路由棧中大致是這樣的:
A---B---C---B ,此時按返回鍵鐵定是返回C了,那麼這種情況有兩種解決辦法:

2、第一種

在頁面C中跳轉時,就直接返回,而不是push一個路由。

this.$router.back(-1);

那此時的路由棧就只有:A---B
此時在B中點選返回,也就直接回退到A了。

3、第二種

在C頁面依舊push:

 this.$router.push({path:'/B'});

而在B頁面加入:beforeRouteLeave,或者直接在router/index.js中B頁面的路由配置內加上也行。
例外一個beforeRouteEnter用法也差不多,只是作用在進入該頁面時,比created執行要早。

每個守衛方法接收三個引數:

to: Route: 即將要進入的目標 路由物件

from: Route: 當前導航正要離開的路由

next: Function: 一定要呼叫該方法來 resolve 這個鉤子。

let fromURL = "";
export default {
	fromURL,//定義一個全域性變數,儲存上一個URL
	
	data(){……},
	
	beforeRouteEnter (to, from, next) {
		//進入該頁面時,記錄上一個URL
		fromURL = from.name;
		console.log(from.name);  //C
		next();
	},
	
	beforeRouteLeave(to, from, next) {
		console.log('此時的路由棧:' + history.length);
		if (fromURL == 'C' && to.name == 'C') {
		       next('A');          //當按返回鍵是C--B--C 情形時,直接跳轉至A
		} else {
		   	next();            //預設跳轉
		}
	},
	    
	methods:{……},
}

如果不考慮之前的URL,直接beforeRouteLeave(to, from, next) { to.name == 'C' ... },這樣會導致B–C普通跳轉也失敗。