vue页面关闭前的执行(Vue 页面监听用户预览时间功能的实现代码)
vue页面关闭前的执行
Vue 页面监听用户预览时间功能的实现代码最近的业务中涉及到这样一个需求,在线培训的系统需要知道用户对某个在线预览的页面追踪用户的预览时长。初步我们首先想到借助 Vue 页面的生命周期函数 mounted
和 destroyed
,分别在其中加入开始计时和清除计时的逻辑,通过后台的接口上报对应的培训素材的时间数据,即可达到目的。
有了思路,我们就可以开始筹划具体的代码。
定义开始结束计时函数在 data
中定义我们通过变量定义计时器,这样可以通过 this.timer
随处可访问,便于后面销毁页面的时候清除它。
duration
为时长的计数变量,初始化为 0,可根据计时器的第二个时间间隔参数,决定单位是秒还是毫秒。
export default { data() { return { timer: null, duration: 0 } }, methods: { startTimer() { this.timer = setInterval(() => { console.log('观看时长: ', this.duration) this.duration++ }, 1000) }, stopTimer() { clearInterval(this.timer) this.updateViewHistory() // 上报数据接口 }, updateViewHistory() { // 上报接口逻辑代码 .... } } }
在 startTimer
函数中我们顺便打印出 duration
变量来验证显示的时间是否正确。
定义好了开始结束的方法,我们就要开始想在哪调用它们。因为预览的页面内容不是唯一的,是根据素材的 id
来获取详情进行渲染的。如果我们把 startTimer
写在 mounted
生命周期里,那么当我们访问不同 id
的页面的时候,无法正常切换我们想要的逻辑。
所以我选择了通过监听路由中的 id
参数,来达到在预览不同页面时候来切换开始和结束的逻辑
watch: { $route: { immediate: true, handler(to, from) { if (to.params.id) this.trainingId = to.params.id this.startTimer() } } }
调用了开始计时的方法,终于我们可以在 console
的 log
中可以看到输出了当前的时长
然后也是最后一步,我们需要在页面销毁的时候调用 stopTimer
函数来清除定时器,上报数据。
由于我们的预览页面是通过
window.open
打开的独立的标签页,所以这里是通过destroyed
生命周期函数监听。如果是通过路由方法进行的跳转,那么我们需要在离开页面的时候进行销毁,方可再通过destroyed
监听到。
mounted() { window.addEventListener('beforeunload', e => this.beforeunloadHandler(e)) }, destroyed() { window.removeEventListener('beforeunload', e => this.beforeunloadHandler(e)) }
通过 window
的监听器方法来来间接调用 stopTimer
方法
methods: { beforeunloadHandler (e) { this.stopTimer() } }
这里有人会问为什么不直接在 destroyed
中调用 stopTimer
方法,这样可以分离出特有的逻辑,不与 destroyed
中其它的逻辑混在一起。提高代码的可读性和维护性。
在写代码的时候我们不仅要实现功能,还要想的更多一点,这就是普通和高手的区别。
到此这篇关于Vue 页面监听用户预览时间的文章就介绍到这了,更多相关Vue 监听用户预览时间内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- vue3.0 如何使用useroute(详解vue3中setUp和reactive函数的用法)
- vue封装组件技巧(浅谈vue中所有的封装方式总结)
- vuex中action的值怎么接(vuex中Getter的用法详解)
- vue代码和element用法(Vue Element前端应用开发之整合ABP框架的前端登录)
- vue购物车简单项目(vue实现简单购物车案例)
- vue调用后台接口实现预览(vue实现集成腾讯TIM即时通讯)
- vue滚动条滚动事件(vue实现一个滚动条样式)
- electronvue最新版本(Vue3和Electron实现桌面端应用详解)
- vue pdf预览插件(Vue-pdf实现在线预览PDF文件)
- icon图标怎么引入vue(vue引入iconfont图标库的优雅实战记录)
- vue前端搜索功能如何实现(使用Vue3+Vant组件实现App搜索历史记录功能示例代码)
- vueelementui动态表格(Vue Element前端应用开发之常规的JS处理函数)
- vue3组件通讯消息(Vue3实现Message消息组件示例)
- vue怎么实现输入框(vue车牌输入组件使用方法详解)
- vue动态路由实现权限控制(vue2/vue3路由权限管理的方法实例)
- vueelementui表格操作(Vue组件库ElementUI实现表格列表分页效果)
- 你怎么忘了是说先爱我(你怎么忘了如何爱我)
- 做技术难吗(技术难不难)
- 林心如是谁(林心如是谁演的)
- 泰国安全吗(泰国安全吗2023)
- 菲律宾安全吗(菲律宾安全吗)
- 泰国旅游攻略(泰国旅游攻略必去景点)
热门推荐
- nginx虚拟主机配置推荐(nginx配置虚拟主机的详细步骤)
- sql server 字符串处理(SQL Server中利用正则表达式替换字符串的方法)
- php 获取get url(PHP实现获取url地址中顶级域名的方法示例)
- php有几种模式(php 策略模式原理与应用深入理解)
- 常见的mysql优化策略(MySQL pt-slave-restart工具的使用简介)
- mysql的视图和临时表区别(MySQL 内存表和临时表的用法详解)
- python 提取微信消息(python实现文件助手中查看微信撤回消息)
- idea里面怎么配置tomcat(intellij idea 使用Tomcat部署的项目位置在哪)
- sqlserver备份整表数据的语句(SqlServer批量备份多个数据库且删除3天前的备份)
- javascript制作表格(JavaScript实现动态表格效果)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9