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 相关文章推荐
滚动经典最新话题[prototype框架]下编写
Oct 03 Javascript
jquery text,radio,checkbox,select操作实现代码
Jul 09 Javascript
JavaScript创建类/对象的几种方式概述及实例
May 06 Javascript
js中各种类型的变量在if条件中是true还是false
Jul 16 Javascript
jQuery实现表单步骤流程导航代码分享
Aug 28 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
Sep 15 Javascript
对js eval()函数的一些见解
Aug 15 Javascript
详解EasyUi控件中的Datagrid
Aug 23 Javascript
vue 2.0项目中如何引入element-ui详解
Sep 06 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
Jul 25 Javascript
jQuery实现B2B网站后台管理系统侧导航
Jul 08 jQuery
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 27 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
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
PHP实现适用于文件内容操作的分页类
2016/06/15 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
javascript 贪吃蛇实现代码
2008/11/22 Javascript
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
基于打包工具Webpack进行项目开发实例
2018/05/29 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
详解js中Array的方法及技巧
2018/09/12 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
[03:41]2018完美盛典-《Fight With Us》
2018/12/16 DOTA
python实现的简单窗口倒计时界面实例
2015/05/05 Python
python实现数独算法实例
2015/06/09 Python
使用python实现语音文件的特征提取方法
2019/01/09 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
CSS3 分类菜单效果
2019/05/27 HTML / CSS
养殖行业的创业计划书
2014/01/05 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
孔繁森观后感
2015/06/10 职场文书
党员发展大会主持词
2015/07/03 职场文书