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 while语句和do while语句的区别分析
Dec 08 Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
Mar 17 Javascript
js 火狐下取本地路径实现思路
Apr 02 Javascript
js操作css属性实现div层展开关闭效果的方法
May 11 Javascript
使用angularjs创建简单表格
Jan 21 Javascript
老生常谈javascript的类型转换
Oct 12 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
Nov 24 Javascript
jQuery实现左右滑动的toggle方法
Mar 03 jQuery
JS字符串去除连续或全部重复字符的实例
Mar 08 Javascript
jQuery实现简易聊天框
Feb 08 jQuery
JavaScript中的this/call/apply/bind的使用及区别
Mar 06 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
Jul 26 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面向对象——访问修饰符介绍
2012/11/08 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
php pdo操作数据库示例
2017/03/10 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
Javascript 判断函数类型完美解决方案
2009/09/02 Javascript
基于Jquery的简单&amp;简陋Tabs插件代码
2010/02/09 Javascript
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
对angular4子路由&amp;辅助路由详解
2018/10/09 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
vue切换菜单取消未完成接口请求的案例
2020/11/13 Javascript
Python脚本实现12306火车票查询系统
2016/09/30 Python
python递归查询菜单并转换成json实例
2017/03/27 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
行政助理的职责
2013/11/14 职场文书
甜美蛋糕店创业计划书
2014/01/30 职场文书
社团2014年植树节活动总结
2014/03/11 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
公安学专业求职信
2014/07/27 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
授权收款委托书范本
2014/10/10 职场文书
关于长城的导游词
2015/01/30 职场文书
贷款工资证明范本
2015/06/12 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
MySQL中CURRENT_TIMESTAMP的使用方式
2021/11/27 MySQL