mixins.ts

1 import { Vue, Component, Watch } from "vue-property-decorator" 2 Component.registerHooks([ 3 'beforeRouteLeave' 4 ]) 5 @Component 6 /* 此mixin用来页面离开时编辑提示, 7 如果组件引入该mixin,那么默认:url改变或者刷新关闭时会给出提示; 8 如果引入的组件更改url时不需要提示(比如点击保存按钮时),那么需要将showLeaveHint手动置为false */ 9 export class LeaveHintMixin extends Vue { 10 showLeaveHint: boolean = true; 11 hintMessage: string = '页面中有正在编辑的内容,继续将不会保存'; 12 13 /* ---- 函数 ---- */ 14 showLeaveHintFun(next) { 15 if (window.confirm(this.hintMessage)) { 16 next(); 17 } else { 18 next(false); 19 } 20 } 21 22 /* 绑定与解绑浏览器刷新关闭事件 */ 23 bindBeforeunload() { 24 // 点击刷新、关闭按钮,直接通过浏览器给出提示 25 window.onbeforeunload = (event) => { 26 event.returnValue = this.hintMessage; 27 return this.hintMessage; 28 }; 29 } 30 unbindBeforeunload() { 31 window.onbeforeunload = null; 32 } 33 34 /* ---- 生命周期 ---- */ 35 // 改变url时,给出提示 36 beforeRouteLeave(to, from, next) { 37 if (this.showLeaveHint) { 38 this.showLeaveHintFun(next); 39 } else { 40 next(); 41 } 42 } 43 // 组件渲染完绑定浏览器刷新关闭事件 44 mounted() { 45 if (this.showLeaveHint) { 46 this.bindBeforeunload(); 47 } 48 } 49 // 组件摧毁时解绑事件 50 beforeDestroy() { 51 this.unbindBeforeunload(); 52 } 53 54 // 添加监控使得组件能够更加灵活控制编辑提示,组件改变showLeaveHint时,便可以绑定或者解绑事件控制提示 55 @Watch('showLeaveHint') 56 bindClick(val) { 57 if (val) { 58 this.bindBeforeunload(); 59 } else { 60 this.unbindBeforeunload(); 61 } 62 } 63 }
使用方法 use.ts

1 import { Vue, Watch, Component } from 'vue-property-decorator' 2 import { mixins } from 'vue-class-component' 3 import { LeaveHintMixin } from '../../common/mixins' 4 5 @Component 6 7 export default class Use extends mixins(LeaveHintMixin) { 8 //引入mixins.ts默认更改url、刷新、关闭时会给出提示 9 10 showLeaveHint = false; // 这样会覆盖mixins.ts中的showLeaveHint,会改为默认没提示,跟不引入一样 11 12 //后面通过改变this.showLeaveHint 可以控制更改url、刷新、关闭时是否给出提示 13 }