私のvueJSプロジェクトで、現在のルートが変更される前に確認ダイアログを表示したいと思います。
はいの場合、次の目的のルートにリダイレクトする必要があります。そうでない場合は、同じルートを維持します。
それを達成する方法はありますか?
前もって感謝します。
In-Component GuardsbeforeRouteLeave
を使用できます。 https://router.vuejs.org/en/advanced/navigation-guards.html を参照してください。
デモ: https://codesandbox.io/s/jzr5nojn39 (ホーム、ページ1、ページ2の間を移動してみてください)
サンプルコード(確認ダイアログとして vuejs-dialog を使用):
_ beforeRouteLeave (to, from, next) {
this.$dialog.confirm('Do you want to proceed?')
.then(function () {
next();
})
.catch(function () {
next(false);
});
}
_
続行する場合は、next()
を使用してください。
リダイレクトをキャンセルする必要がある場合は、next(false)
を使用します。
受け入れられた答えは vuejs-dialog を使用してそれを行う方法を示しています。ただし、このライブラリを使用しない場合は、以下を確認してください。
3つのオプションを持つダイアログがあるとします:
ダイアログを閉じる=> closeDialog()
を呼び出し、同じページに留まる
変更を保存=> saveChanges()
を呼び出し、変更を保存して移動します
変更を破棄する=>呼び出しdiscardChanges()
変更を保存せずに移動します
data: () => ({
to: null,
showDialog: false
}),
beforeRouteLeave(to, from, next) {
if (this.to) {
next();
} else {
this.to = to;
this.showDialog = true;
}
},
methods: {
closeDialog() {
this.showDialog = false;
this.to = null;
},
saveChanges() {
// add code to save changes here
this.showDialog = false;
this.$router.Push(this.to);
},
discardChanges() {
this.showDialog = false;
this.$router.Push(this.to);
}
}
Takeawayここで重要なポイントは beforeRouteLeave ナビゲーションガードです。ここで、to
の場合、ユーザーがナビゲートすることはできません。データのプロパティがnullです。 nullにできない唯一のケースは、ユーザーがダイアログの[保存]または[破棄]ボタンをクリックしたときです。
VueJSにはIn Component Navigation GuardsのようなbeforeRouteUpdate
とbeforeRouteLeave
があります
beforeRouteEnter (to, from, next) {
// called before the route that renders this component is confirmed.
// does NOT have access to `this` component instance,
// because it has not been created yet when this guard is called!
},
...
beforeRouteLeave (to, from, next) {
// called when the route that renders this component is about to
// be navigated away from.
// has access to `this` component instance.
}
次のコードは私のために働きます
<v-btn @click="deleteDialog = true">Delete</v-btn>
<v-dialog v-model="deleteDialog" max-width="500px">
<v-card>
<v-card-title style="font-size:20px" >Are you sure you want to archive?</v-card-title>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="red" style="font-size:15px" flat @click.native="deleteDialog = false">No</v-btn>
<v-btn color="green" style="font-size:15px" flat @click.native="deleteItem">Yes</v-btn>
</v-card-actions>
</v-card>
</v-dialog>