vue routerのルートで使用されるコンポーネントの作成されたフックに 'beforeunload'イベントを登録しました。
ブラウザタブを閉じる、ブラウザタブを更新する、またはブラウザを閉じるときにユーザーを削除するために、このイベントハンドラを呼び出します。
ComponentAについて
created (){
window.addEventListener('beforeunload', () => {
this.removeUser()
return null
})
}
ComponentBに微笑んで
created (){
window.addEventListener('beforeunload', () => {
this.removeUser()
return null
})
}
そして私のrouter.js
{
path: '/staff/call/:session_key',
name: 'Staff Call',
component: ComponentA,
meta: {auth: true}
},
{
path: '/consumer/call/:session_key',
name: 'Consumer Call',
component: ComponentB
},
ここで、「beforeunload」イベントハンドラーはランダムにトリガーされます。それは時々それが引き起こされることもあればそうでないこともあります。トリガーされたときとされていないときのパターンを見つけます。
ここで何が欠けていますか?
Vue F5またはCtrl + Rを押すたびに)でページの更新/変更を検出する場合は、 Navigation Timing API を使用する必要がある場合があります。
PerformanceNavigation.type は、ページへのアクセス方法を示します。
created() {
// does the browser support the Navigation Timing API?
if (window.performance) {
console.info("window.performance is supported");
}
// do something based on the navigation type...
if(performance.navigation.type === 1) {
console.info("TYPE_RELOAD");
this.removeUser();
}
}
私は上記の例をいじる必要がありました。これが最も堅牢なソリューションだと思います。
let app1 = new Vue({
delimiters: ['[[', ']]'],
el: '#app',
data: {
dirty_form: true,
},
created () {
console.log('created')
window.addEventListener('beforeunload', this.confirm_leaving)
},
methods: {
confirm_leaving (evt) {
if (this.dirty_form) {
const unsaved_changes_warning = "You have unsaved changes. Are you sure you wish to leave?";
evt.returnValue = unsaved_changes_warning;
return unsaved_changes_warning;
};
};
},
});