vue实现提示保存后退出的方法

下面我就为大家分享一篇vue实现提示保存后退出的方法,具有很好的参考价值,希望对大家有所帮助。

假设有这样一个需求,用户在一个页面内编辑文字,但是并未点击保存并且跳转到了下一个路由。比较好的做法应该是给出一个提示—“您编辑的内容还未保存,是否确认退出?”用户如果点击“确定”,那么不保存当前内容直接退出,用户如果点击“取消”,则取消本次路由跳转,继续留在原来的页面。

尝试的错误做法

一开始的时候我是想着使用vuex结合vue router的beforeEach导航守卫来实现。代码如下:

首先在vuex中新增一个状态值—introduceState

立即学习“前端免费学习笔记(深入)”;

const store = new Vuex.Store({ strict: true, // process.env.NODE_ENV !== 'production', 直接修改state 抛出异常 state: {  ....  introduceState: false,  .... }, getters: {  introduceState: state => state.currentMenus }, mutations: {  // 更新introduceState的值  changeIntroduceState (state, value) {   state.introduceState = value  } }})

登录后复制

用户在点击跳转到另一个页面的时候会触发生命周期函数beforeDestroy,在这个函数中我们可以检测用户的编辑内容是否保存,如果尚未保存。

如果内容尚未保存,我们就弹出一个提示框,当用户选择取消的时候,就将vuex中的introduceState值更新为true。

import { mapGetters, mapActions, mapMutations } from "vuex"export default { data() {  return {   contentHasSave: false // 记录用户是否已经保存内容  } }, methods: {  ...mapMutations({   changeIntroduceState: changeIntroduceState  }) }, beforeDestory: function(){  if(!contentHasSave){   // 使用element的提示框   this.$confirm('您还未保存简介,确定需要提出吗?', '提示', {    confirmButtonText: '确定',    cancelButtonText: '取消',    type: 'warning'   }).then(() => {    // 选择确定,正常跳转   })   .catch(() => {    // 选择取消    this.changeIntroduceState(true)   })  } }}

登录后复制

最后在router的beforeEach的导航守卫里监测from为当前页面的所有路由跳转。当state的introduceState为true的时候使用next(false)来取消本次路由跳转

import Vue from "vue";import VueRouter from "vue-router";import routeConfig from "./routes";import {sync} from "vuex-router-sync";import store from "../store";//加载路由中间件Vue.use(VueRouter)//定义路由const router = new VueRouter({ routes: routeConfig, //mode: 'history'})sync(store, router)router.beforeEach((to, from, next) => { // 简介也未提交,取消跳转 if(from.fullPath === '/adwords/introduce' && store.state.introduceState === 'not-save'){  next(false) }})export default router

登录后复制

这种做法其实是行不通的,因为beforeEach方法的执行其实是在组件beforeDestory的方法之前执行的,也就是说beforeEach执行的时候introduceState的值根本没有被更新为true。

正确的做法

后来自己去翻vue router的官方文档,找到了一个绝妙的方法,那就是组件内的导航守卫。

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` }}

登录后复制

上面的描述很清楚,于是我就在组件的js代码里加了一个beforeRouteLeave方法,然后弹出提示框,实现提示保存后退出的功能。

export default { data() {  return {   contentHasSave: false // 记录用户是否已经保存内容  } },  // 组件内导航钩子,处理未保存退出的情况 beforeRouteLeave: function(to, from , next){  if(this.buttonText === '提交'){   next(false)   this.$confirm('您还未保存简介,确定需要提出吗?', '提示', {    confirmButtonText: '确定',    cancelButtonText: '取消',    type: 'warning'   }).then(() => {    // 选择确定    next()   })  } }}

登录后复制

实现效果如下:

vue实现提示保存后退出的方法

vue实现提示保存后退出的方法

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

js中如何完美的解析数据

解决使用vue.js路由后失效的问题

vue实现的上传图片到数据库并显示到页面功能示例

以上就是vue实现提示保存后退出的方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2753914.html

(0)
上一篇 2025年3月8日 06:48:06
下一篇 2025年3月8日 06:48:19

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • create-react-app构建项目慢的解决方法

    这篇文章主要介绍了create-react-app构建项目慢的解决方法,现在分享给大家,也给大家做个参考。 create-react-app慢的解决方法 在操作官方实例Create React App时,需要执行指令: create-rea…

    2025年3月8日
    200
  • Vue.js 动态为img的src赋值方法

    下面我就为大家分享一篇vue.js 动态为img的src赋值方法,具有很好的参考价值,希望对大家有所帮助。 需求是这样: ajax获取数据如下 { “code”: “200”, “data”: {  “SumAmount”: 200,  “…

    编程技术 2025年3月8日
    200
  • 基于Axios 常用的请求方法别名(详解)

    下面我就为大家分享一篇axios 常用的请求方法别名,具有很好的参考价值,希望对大家有所帮助。 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。 常用的请求方法别名一般有: Get/post/…

    编程技术 2025年3月8日
    200
  • vue加载自定义的js文件方法

    下面小编就为大家分享一篇vue加载自定义的js文件方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 在做项目中需要自定义弹出框。就自己写了一个。 效果图 遇见的问题 怎么加载自定义的js文件 立即学习“前端免费学习笔记(…

    2025年3月8日
    200
  • vue路由懒加载的实现方法

    本篇文章主要介绍了vue路由懒加载的实现方法,现在分享给大家,也给大家做个参考。 本文介绍了vue的路由懒加载,分享给大家,具体如下: 我们可以把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件。 componen…

    编程技术 2025年3月8日
    200
  • JS对DOM树实现遍历有哪些方法

    这次给大家带来JS对DOM树实现遍历有哪些方法,JS对DOM树实现遍历的注意事项有哪些,下面就是实战案例,一起来看一下。 二叉 DOM 树的遍历 function Tree() { var Node = function(key){ thi…

    编程技术 2025年3月8日
    200
  • 在react-router4中进行代码拆分的方法(基于webpack)

    这篇文章主要介绍了在react-router4中进行代码拆分的方法(基于webpack),现在分享给大家,也给大家做个参考。 前言 随着前端项目的不断扩大,一个原本简单的网页应用所引用的js文件可能变得越来越庞大。尤其在近期流行的单页面应用…

    2025年3月8日
    200
  • JS中所有循环遍历方法总结

    这次给大家带来JS中所有循环遍历方法总结,JS中循环遍历总结的注意事项有哪些,下面就是实战案例,一起来看一下。 1、for 循环 let arr = [1,2,3];for (let i=0; i<arr.length; i++){ …

    编程技术 2025年3月8日
    200
  • 使用缓存调用链实现JS方法重载步骤详解

    这次给大家带来使用缓存调用链实现JS方法重载步骤详解,使用缓存调用链实现JS方法重载的注意事项有哪些,下面就是实战案例,一起来看一下。 1.什么是方法重载 方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的…

    编程技术 2025年3月8日
    200
  • 在vue项目中通过tween方法如何实现返回顶部

    这篇文章主要介绍了vue项目tween方法实现返回顶部,现在分享给大家,也给大家做个参考。 一、场景 tween.js是一款可生成平滑动画效果的js动画库 当你要实现一个返回顶部的功能时候你会怎么做,大部分人会使用document.body…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论