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 相关文章推荐
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
Aug 15 Javascript
轻松实现jquery选项卡切换效果
Oct 10 Javascript
jquery表单验证插件validation使用方法详解
Jan 20 Javascript
用jQuery实现圆点图片轮播效果
Mar 19 Javascript
JavaScript使用ZeroClipboard操作剪切板
May 10 Javascript
jQuery为某个div加入行样式
Jun 09 jQuery
Bootstrap一款超好用的前端框架
Sep 25 Javascript
Mac下安装vue
Apr 11 Javascript
深入理解Angularjs 脏值检测
Oct 12 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
Oct 28 Javascript
vue全局使用axios的操作
Sep 08 Javascript
关于vue 项目中浏览器跨域的配置问题
Nov 10 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
php.ini中文版
2006/10/09 PHP
PHP IPV6正则表达式验证代码
2010/02/16 PHP
浅析51个PHP处理字符串的函数
2013/08/02 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
jQuery 使用手册(六)
2009/09/23 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
Cpy和Python的效率对比
2015/03/20 Python
python动态网页批量爬取
2016/02/14 Python
详解python中的文件与目录操作
2017/07/11 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
python实现textrank关键词提取
2018/06/22 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
python中如何使用分步式进程计算详解
2019/03/22 Python
三步实现Django Paginator分页的方法
2019/06/11 Python
Python使用python-docx读写word文档
2019/08/26 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
大数据分析用java还是Python
2020/07/06 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
电子专业推荐信范文
2013/11/18 职场文书
企业年度评优方案
2014/06/02 职场文书
谢师宴答谢词
2015/01/05 职场文书
八年级语文教学反思
2016/03/03 职场文书
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android