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中scrollLeft()方法用法实例
Jan 16 Javascript
jQuery实现带滚动线条导航效果的方法
Jan 30 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
Dec 08 Javascript
js实现滑动到页面底部自动加载更多功能
Feb 15 Javascript
node文件批量重命名的方法示例
Oct 23 Javascript
webpack写jquery插件的环境配置
Dec 21 jQuery
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 Javascript
vue解决弹出蒙层滑动穿透问题的方法
Sep 22 Javascript
vue中组件的3种使用方式详解
Mar 23 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
Apr 01 Javascript
layer提示框添加多个按钮选择的实例
Sep 12 Javascript
Vue使用Proxy代理后仍无法生效的解决
Nov 13 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脚本中include文件出错解决方法
2008/11/20 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
vue自定义指令实现方法详解
2019/02/11 Javascript
原生javascript自定义input[type=radio]效果示例
2019/08/27 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
CSS3实现圆角、阴影、透明效果并兼容各大浏览器
2014/08/08 HTML / CSS
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
购买正版游戏和游戏激活码:Green Man Gaming
2019/11/06 全球购物
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
计算机专业学生求职信分享
2013/12/15 职场文书
法学专业本科生自荐信范文
2013/12/17 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
2015年安全教育月活动总结
2015/03/26 职场文书
小学学习委员竞选稿
2015/11/20 职场文书
高中班主任寄语
2019/06/21 职场文书
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL