Vue 页面监听用户预览时间功能的实现代码

作者:太空编程 时间:2024-04-27 15:56:25 

最近的业务中涉及到这样一个需求,在线培训的系统需要知道用户对某个在线预览的页面追踪用户的预览时长。初步我们首先想到借助 Vue 页面的生命周期函数 mounteddestroyed,分别在其中加入开始计时和清除计时的逻辑,通过后台的接口上报对应的培训素材的时间数据,即可达到目的。

有了思路,我们就可以开始筹划具体的代码。

定义开始结束计时函数

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()
     }
   }
 }

调用了开始计时的方法,终于我们可以在 consolelog 中可以看到输出了当前的时长

Vue 页面监听用户预览时间功能的实现代码

然后也是最后一步,我们需要在页面销毁的时候调用 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 中其它的逻辑混在一起。提高代码的可读性和维护性。

在写代码的时候我们不仅要实现功能,还要想的更多一点,这就是普通和高手的区别。

来源:https://blog.csdn.net/u013919171/article/details/118672607

标签:Vue,页面,监听
0
投稿

猜你喜欢

  • Python第三方库jieba库与中文分词全面详解

    2022-03-14 22:32:40
  • python每次处理固定个数的字符的方法总结

    2021-06-23 15:45:48
  • Mysql数据库性能优化一

    2024-01-20 17:06:45
  • GO中 分组声明与array, slice, map函数

    2024-04-30 10:02:54
  • Python垃圾回收机制三种实现方法

    2023-02-22 00:24:42
  • python删除某个目录文件夹的方法

    2022-08-22 06:33:32
  • 聊聊Python代码中if __name__ == ‘__main__‘的作用是什么

    2022-05-10 18:06:44
  • 详解python中的defaultdict 默认值

    2022-12-27 08:51:40
  • javascript修正12个浏览器兼容问题[译]

    2009-04-23 12:19:00
  • JavaScript游戏开发之键盘控制层的移动

    2008-09-13 19:29:00
  • Bootstrap-table自定义可编辑每页显示记录数

    2024-04-29 13:12:30
  • 对python借助百度云API对评论进行观点抽取的方法详解

    2023-12-06 19:42:12
  • 原生js实现放大镜组件

    2024-05-11 09:06:05
  • go使用consul实现服务发现及配置共享实现详解

    2024-04-23 09:48:01
  • python实现名片管理系统

    2021-04-02 22:21:40
  • CI操作cookie的方法分析(基于helper类库)

    2023-11-20 21:59:07
  • mysql中GROUP_CONCAT的使用方法实例分析

    2024-01-28 01:01:26
  • 利用ASP在线维护数据库

    2007-10-12 13:53:00
  • python 如何读、写、解析CSV文件

    2022-09-21 13:59:33
  • 使用Python生成XML的方法实例

    2022-10-01 19:20:15
  • asp之家 网络编程 m.aspxhome.com