項目中有個頁面需要用戶離開時提示用戶,否則會丟失一些數據,vue有個組件內的守衛剛好合適,先上官網例子:
const Foo = { template: `...`, beforeRouteEnter (to, from, next) { // 在渲染該組件的對應路由被 confirm 前調用 // 不!能!獲取組件實例 `this` // 因為當守衛執行前,組件實例還沒被創建 }, beforeRouteUpdate (to, from, next) { // 在當前路由改變,但是該組件被復用時調用 // 舉例來說,對於一個帶有動態參數的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉的時候, // 由於會渲染同樣的 Foo 組件,因此組件實例會被復用。而這個鈎子就會在這個情況下被調用。 // 可以訪問組件實例 `this` }, beforeRouteLeave (to, from, next) { // 導航離開該組件的對應路由時調用 // 可以訪問組件實例 `this` const answer = window.confirm('Do you really want to leave? you have unsaved changes!') if (answer) { next() } else { next(false) } } }
看起來簡潔明了,但是直接拿到項目中去,會發現沒有觸發,ps(項目用ts);
還需要在該組件加行代碼:
import {Component, Vue} from 'vue-property-decorator'; Component.registerHooks([ 'beforeRouteLeave', ]);