Dans mon projet vueJS, je veux afficher la boîte de dialogue de confirmation avant que l'itinéraire actuel ne change.
Si oui, il doit rediriger vers le prochain itinéraire souhaité, sinon conservez-le sur le même itinéraire.
Une idée de comment y parvenir?
Merci d'avance.
Vous pouvez utiliser les gardes en composantes beforeRouteLeave
. Voir https://router.vuejs.org/en/advanced/navigation-guards.html .
Démo: https://codesandbox.io/s/jzr5nojn39 (essayez de naviguer entre la maison, page 1, page 2)
Exemple de code (en utilisant vuejs-dialog comme boîte de dialogue de confirmation):
beforeRouteLeave (to, from, next) {
this.$dialog.confirm('Do you want to proceed?')
.then(function () {
next();
})
.catch(function () {
next(false);
});
}
Si cela devait continuer, utilisez next()
.
Si la redirection doit être annulée, utilisez next(false)
.
La réponse acceptée montre comment le faire en utilisant vuejs-dialog . Mais si vous ne souhaitez pas utiliser cette bibliothèque, vérifiez ci-dessous:
Supposons que vous ayez une boîte de dialogue avec 3 options:
fermer la boîte de dialogue => appelle closeDialog()
et reste sur la même page
enregistrer les modifications => appelle saveChanges()
enregistrer les modifications et s'éloigne
annuler les modifications => appelle discardChanges()
s'éloigne sans enregistrer les modifications
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);
}
}
Voir en action dans codesandbox
À emporter La clé à retenir ici est le beforeRouteLeave garde de navigation, où nous n'autorisons pas l'utilisateur à s'éloigner si le to
la propriété dans les données est nulle. Le seul cas où il ne peut pas être nul est lorsque l'utilisateur clique sur le bouton Enregistrer ou supprimer dans la boîte de dialogue.
VueJS a dans les gardes de navigation des composants comme beforeRouteUpdate
et 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.
}
Le code suivant fonctionne pour moi
<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>