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 相关文章推荐
如何实现iframe(嵌入式帧)的自适应高度
Jul 26 Javascript
JavaScript CSS修改学习第三章 修改样式表
Feb 19 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
Apr 24 Javascript
js清除input中type等于file的值域(示例代码)
Dec 24 Javascript
JS不完全国际化&amp;本地化手册 之 理论篇
Sep 27 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
Jan 16 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
Bootstrap表单简单实现代码
Mar 06 Javascript
使用3D引擎threeJS实现星空粒子移动效果
Sep 13 Javascript
微信小程序实现天气预报功能
Jul 18 Javascript
vue生成文件本地打开查看效果的实例
Sep 06 Javascript
微信小程序常见页面跳转操作简单示例
May 01 Javascript
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
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
js setTimeout 常见问题小结
2013/08/13 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
jQuery中dequeue()方法用法实例
2014/12/29 Javascript
javascript实现rgb颜色转换成16进制格式
2015/07/10 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
基于jQuery Ajax实现下拉框无刷新联动
2017/12/06 jQuery
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
2018/10/19 Javascript
微信小程序实现评论功能
2018/11/28 Javascript
vue实现菜单切换功能
2019/05/08 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
Python对字符串实现去重操作的方法示例
2017/08/11 Python
python进行两个表格对比的方法
2018/06/27 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
pygame实现五子棋游戏
2019/10/29 Python
python字符串下标与切片及使用方法
2020/02/13 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
python切割图片的示例
2020/11/12 Python
ajax是什么及其工作原理
2012/02/08 面试题
竞选班长演讲稿
2013/12/30 职场文书
班主任班级寄语大全
2014/04/04 职场文书
简爱读书笔记
2015/06/26 职场文书
《颐和园》教学反思
2016/02/19 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript
源码分析Redis中 set 和 sorted set 的使用方法
2022/03/22 Redis