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


Posted in Javascript onMarch 15, 2018

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

尝试的错误做法

一开始的时候我是想着使用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。

</script>
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)
   })
  }
 }
}
</script>

最后在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方法,然后弹出提示框,实现提示保存后退出的功能。

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

实现效果如下:

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

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

以上这篇vue实现提示保存后退出的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript判断对象是否相等实现代码
Mar 18 Javascript
封装了jQuery的Ajax请求全局配置
Feb 05 Javascript
Jquery解析json字符串及json数组的方法
May 29 Javascript
JavaScript实现网页加载进度条代码超简单
Sep 21 Javascript
phantomjs导出html到pdf的方法总结
Oct 19 Javascript
React.js绑定this的5种方法(小结)
Jun 05 Javascript
jQuery插件实现弹性运动完整示例
Jul 07 jQuery
实例分析Array.from(arr)与[...arr]到底有何不同
Apr 09 Javascript
vue 实现特定条件下绑定事件
Nov 09 Javascript
详解ES6 CLASS在微信小程序中的应用实例
Apr 24 Javascript
openlayers4实现点动态扩散
Aug 17 Javascript
vue-drawer-layout实现手势滑出菜单栏
Nov 19 Vue.js
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
Mar 15 #Javascript
vue-cli创建的项目,配置多页面的实现方法
Mar 15 #Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
Mar 15 #Javascript
iview中Select 选择器多选校验方法
Mar 15 #Javascript
用Axios Element实现全局的请求loading的方法
Mar 15 #Javascript
基于IView中on-change属性的使用详解
Mar 15 #Javascript
解决iView中时间控件选择的时间总是少一天的问题
Mar 15 #Javascript
You might like
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
php基于环形链表解决约瑟夫环问题示例
2017/11/07 PHP
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
Node.js模块加载详解
2014/08/16 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
JavaScript中this详解
2015/09/01 Javascript
fastclick插件导致日期(input[type=&quot;date&quot;])控件无法被触发该如何解决
2015/11/09 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
js面试题之异步问题的深入理解
2020/09/20 Javascript
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
python对象转字典的两种实现方式示例
2019/11/07 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
python 弧度与角度互转实例
2020/04/15 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
电子商务专业个人的自我评价分享
2013/10/29 职场文书
农村党员干部承诺书
2015/05/04 职场文书
基于Python的EasyGUI学习实践
2021/05/07 Python
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python