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 相关文章推荐
js 页面关闭前的出现提示的实现代码
May 25 Javascript
浅析Prototype的模板类 Template
Dec 07 Javascript
javascript学习笔记(七) js函数介绍
Jun 19 Javascript
node.js中的fs.fchmodSync方法使用说明
Dec 16 Javascript
JavaScript中日期函数的相关操作知识
Aug 03 Javascript
你知道setTimeout是如何运行的吗?
Aug 16 Javascript
浅谈JS验证表单文本域输入空格的问题
Feb 14 Javascript
Vue.js父与子组件之间传参示例
Feb 28 Javascript
详解react如何在组件中获取路由参数
Jun 15 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
Jul 12 Javascript
Vue波纹按钮组件制作
Apr 30 Javascript
webpack3升级到webpack4遇到问题总结
Sep 30 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
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
ThinkPHP CURD方法之table方法详解
2014/06/18 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
js利用div背景,做一个竖线的效果。
2008/11/22 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
React Native 图片查看组件的方法
2018/03/01 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
JS实现导航栏楼层特效
2020/01/01 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
Python递归函数定义与用法示例
2017/06/02 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
python基础教程项目五之虚拟茶话会
2018/04/02 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
Python中使用socks5设置全局代理的方法示例
2020/04/15 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
如何设置Java的运行环境
2013/04/05 面试题
奖学金自我鉴定范文
2013/10/03 职场文书
老公给老婆的保证书
2014/04/28 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
python实现简单的井字棋
2021/05/26 Python
简述Java中throw-throws异常抛出
2021/08/07 Java/Android